diff options
author | Sergey Poznyakoff <gray@gnu.org.ua> | 2011-06-26 15:18:29 +0300 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org.ua> | 2011-06-26 21:23:42 +0300 |
commit | 440771ca0056eb20396e24f03d349a75ee1c9d22 (patch) | |
tree | 3ec58a85e96d21a855ad3dcefaa8adc51039fc38 /src/bind-gram.y | |
parent | 4c1959a4848c30206de3be4b16bdf04b650daae8 (diff) | |
download | grecs-440771ca0056eb20396e24f03d349a75ee1c9d22.tar.gz grecs-440771ca0056eb20396e24f03d349a75ee1c9d22.tar.bz2 |
Keep track of columns in the node and value locations. Improve error diagnostics.
* src/grecs.h (grecs_locus_point): New struct.
(grecs_locus_point_advance_line): New macro.
(grecs_locus_t): Redesign.
(grecs_value) <locus>: New member.
(grecs_node) <idloc>: New member.
(grecs_print_diag_fun): Change signature.
(grecs_warning,grecs_error): Change signature.
(grecs_parse_line_directive)
(grecs_parse_line_directive_cpp)
(grecs_string_convert): Change signature.
(grecs_current_locus): Remove.
(grecs_current_locus_point): New extern.
* src/grecs-locus.h: New file.
* src/Make.am (noinst_HEADERS): Add grecs-locus.h.
* src/join.c (reset_locus): Rewrite.
* src/lookup.c: Initialize new members of grecs_value and grecs_node.
(split_cfg_path): Return wrdse error code.
(grecs_node_from_path_locus): Take two grecs_locus_t arguments.
Make sure all created nodes have their locus members
properly initialized.
* src/parser.c (grecs_parse): Initialize grecs_current_locus_point.
* src/tree.c (grecs_node_create_points): New function.
(string_to_bool,string_to_host,string_to_sockaddr)
(grecs_string_convert): Change signatures. Be more precise in
what locus to report.
* src/diag.c (default_print_diag): Use YY_LOCATION_PRINT to
output locus.
(grecs_print_diag_fun): Change signature.
(grecs_warning,grecs_error): Change signature.
* src/format.c (grecs_format_locus): Rewrite.
(grecs_format_node): Be more precise in what locus is being
output.
* src/bind-gram.y: Keep track of locations. Turn on error-verbose mode.
* src/grecs-gram.y: Likewise.
* src/meta1-gram.y: Likewise.
* src/bind-lex.l: Keep track of locations.
* src/git-parser.c: Likewise.
* src/grecs-lex.l: Likewise.
* src/meta1-lex.l: Likewise.
* src/path-parser.c: Likewise.
* src/preproc.c: Likewise.
* tests/gcf1.conf: Untabify.
* tests/format01.at: Reflect changes in the output.
* tests/join.at: Likewise.
* tests/set.at: Likewise.
* tests/locus-bind.at: New testcase.
* tests/locus-git.at: New testcase.
* tests/locus-meta1.at: New testcase.
* tests/locus00.at: New testcase.
* tests/locus01.at: New testcase.
* tests/locus02.at: New testcase.
* tests/path-locus.at: New testcase.
Diffstat (limited to 'src/bind-gram.y')
-rw-r--r-- | src/bind-gram.y | 68 |
1 files changed, 37 insertions, 31 deletions
diff --git a/src/bind-gram.y b/src/bind-gram.y index c751ae1..e353a54 100644 --- a/src/bind-gram.y +++ b/src/bind-gram.y | |||
@@ -19,7 +19,8 @@ | |||
19 | # include <config.h> | 19 | # include <config.h> |
20 | #endif | 20 | #endif |
21 | #include <grecs.h> | 21 | #include <grecs.h> |
22 | #include <grecs-gram.h> | 22 | #include <grecs-locus.h> |
23 | #include <bind-gram.h> | ||
23 | #include <stdlib.h> | 24 | #include <stdlib.h> |
24 | #include <stdarg.h> | 25 | #include <stdarg.h> |
25 | #include <string.h> | 26 | #include <string.h> |
@@ -30,17 +31,16 @@ int yyerror(char *s); | |||
30 | 31 | ||
31 | static struct grecs_node *parse_tree; | 32 | static struct grecs_node *parse_tree; |
32 | extern int yy_flex_debug; | 33 | extern int yy_flex_debug; |
33 | extern int grecs_bind_new_source(const char *name); | 34 | extern int grecs_bind_new_source(const char *name, grecs_locus_t *loc); |
34 | extern void grecs_bind_close_sources(void); | 35 | extern void grecs_bind_close_sources(void); |
35 | 36 | ||
36 | static struct grecs_value *stmtlist_to_value(struct grecs_node *node); | 37 | static struct grecs_value *stmtlist_to_value(struct grecs_node *node); |
37 | %} | 38 | %} |
38 | 39 | ||
40 | %error-verbose | ||
41 | %locations | ||
42 | |||
39 | %union { | 43 | %union { |
40 | struct { | ||
41 | grecs_locus_t locus; | ||
42 | char *string; | ||
43 | } ident; | ||
44 | char *string; | 44 | char *string; |
45 | grecs_value_t svalue, *pvalue; | 45 | grecs_value_t svalue, *pvalue; |
46 | struct grecs_list *list; | 46 | struct grecs_list *list; |
@@ -49,8 +49,7 @@ static struct grecs_value *stmtlist_to_value(struct grecs_node *node); | |||
49 | struct { struct grecs_node *head, *tail; } node_list; | 49 | struct { struct grecs_node *head, *tail; } node_list; |
50 | } | 50 | } |
51 | 51 | ||
52 | %token <ident> BIND_IDENT BIND_CONTROLS | 52 | %token <string> BIND_STRING BIND_IDENT BIND_CONTROLS |
53 | %token <string> BIND_STRING | ||
54 | %type <string> string | 53 | %type <string> string |
55 | %type <svalue> value ctlsub | 54 | %type <svalue> value ctlsub |
56 | %type <pvalue> vallist tag | 55 | %type <pvalue> vallist tag |
@@ -62,8 +61,7 @@ static struct grecs_value *stmtlist_to_value(struct grecs_node *node); | |||
62 | 61 | ||
63 | input : maybe_stmtlist | 62 | input : maybe_stmtlist |
64 | { | 63 | { |
65 | parse_tree = grecs_node_create(grecs_node_root, | 64 | parse_tree = grecs_node_create(grecs_node_root, &@1); |
66 | &grecs_current_locus); | ||
67 | parse_tree->v.texttab = grecs_text_table(); | 65 | parse_tree->v.texttab = grecs_text_table(); |
68 | grecs_node_bind(parse_tree, $1, 1); | 66 | grecs_node_bind(parse_tree, $1, 1); |
69 | } | 67 | } |
@@ -102,38 +100,44 @@ stmt : simple | |||
102 | 100 | ||
103 | simple : BIND_IDENT vallist ';' | 101 | simple : BIND_IDENT vallist ';' |
104 | { | 102 | { |
105 | if (strcmp($1.string, "include") == 0 && | 103 | if (strcmp($1, "include") == 0 && |
106 | $2->type == GRECS_TYPE_STRING) { | 104 | $2->type == GRECS_TYPE_STRING) { |
107 | grecs_bind_new_source($2->v.string); | 105 | grecs_bind_new_source($2->v.string, &@1); |
108 | $$ = NULL; | 106 | $$ = NULL; |
109 | } else { | 107 | } else { |
110 | $$ = grecs_node_create(grecs_node_stmt, &$1.locus); | 108 | $$ = grecs_node_create_points(grecs_node_stmt, |
111 | $$->ident = $1.string; | 109 | @1.beg, @2.end); |
110 | $$->ident = $1; | ||
111 | $$->idloc = @1; | ||
112 | $$->v.value = $2; | 112 | $$->v.value = $2; |
113 | } | 113 | } |
114 | } | 114 | } |
115 | | string ';' | 115 | | string ';' |
116 | { | 116 | { |
117 | $$ = grecs_node_create(grecs_node_stmt, | 117 | $$ = grecs_node_create(grecs_node_stmt, &@1); |
118 | &grecs_current_locus); | ||
119 | $$->ident = $1; | 118 | $$->ident = $1; |
119 | $$->idloc = @1; | ||
120 | $$->v.value = NULL; | 120 | $$->v.value = NULL; |
121 | } | 121 | } |
122 | | '!' string ';' | 122 | | '!' string ';' |
123 | { | 123 | { |
124 | $$ = grecs_node_create(grecs_node_stmt, | 124 | $$ = grecs_node_create_points(grecs_node_stmt, |
125 | &grecs_current_locus); | 125 | @1.beg, @2.end); |
126 | $$->ident = grecs_strdup("!"); | 126 | $$->ident = grecs_strdup("!"); |
127 | $$->v.value = grecs_malloc(sizeof($$->v.value[0])); | 127 | $$->idloc = @1; |
128 | $$->v.value->type = GRECS_TYPE_STRING; | 128 | $$->v.value = grecs_malloc(sizeof($$->v.value[0])); |
129 | $$->v.value->v.string = $2; | 129 | $$->v.value->type = GRECS_TYPE_STRING; |
130 | $$->v.value->locus = @2; | ||
131 | $$->v.value->v.string = $2; | ||
130 | } | 132 | } |
131 | ; | 133 | ; |
132 | 134 | ||
133 | block : BIND_IDENT tag '{' maybe_stmtlist '}' ';' | 135 | block : BIND_IDENT tag '{' maybe_stmtlist '}' ';' |
134 | { | 136 | { |
135 | $$ = grecs_node_create(grecs_node_block, &$1.locus); | 137 | $$ = grecs_node_create_points(grecs_node_block, |
136 | $$->ident = $1.string; | 138 | @1.beg, @5.end); |
139 | $$->ident = $1; | ||
140 | $$->idloc = @1; | ||
137 | $$->v.value = $2; | 141 | $$->v.value = $2; |
138 | grecs_node_bind($$, $4, 1); | 142 | grecs_node_bind($$, $4, 1); |
139 | } | 143 | } |
@@ -151,8 +155,10 @@ block : BIND_IDENT tag '{' maybe_stmtlist '}' ';' | |||
151 | (127.0.0.1, 127.0.0.2), keys, (rndc-key)) | 155 | (127.0.0.1, 127.0.0.2), keys, (rndc-key)) |
152 | */ | 156 | */ |
153 | { | 157 | { |
154 | $$ = grecs_node_create(grecs_node_stmt, &$1.locus); | 158 | $$ = grecs_node_create_points(grecs_node_stmt, |
155 | $$->ident = $1.string; | 159 | @1.beg, @4.end); |
160 | $$->ident = $1; | ||
161 | $$->idloc = @1; | ||
156 | $$->v.value = grecs_value_ptr_from_static(&$3); | 162 | $$->v.value = grecs_value_ptr_from_static(&$3); |
157 | } | 163 | } |
158 | ; | 164 | ; |
@@ -176,6 +182,7 @@ vallist : vlist | |||
176 | 182 | ||
177 | $$ = grecs_malloc(sizeof($$[0])); | 183 | $$ = grecs_malloc(sizeof($$[0])); |
178 | $$->type = GRECS_TYPE_ARRAY; | 184 | $$->type = GRECS_TYPE_ARRAY; |
185 | $$->locus = @1; | ||
179 | $$->v.arg.c = n; | 186 | $$->v.arg.c = n; |
180 | $$->v.arg.v = grecs_calloc(n, | 187 | $$->v.arg.v = grecs_calloc(n, |
181 | sizeof($$->v.arg.v[0])); | 188 | sizeof($$->v.arg.v[0])); |
@@ -201,20 +208,19 @@ vlist : value | |||
201 | value : string | 208 | value : string |
202 | { | 209 | { |
203 | $$.type = GRECS_TYPE_STRING; | 210 | $$.type = GRECS_TYPE_STRING; |
211 | $$.locus = @1; | ||
204 | $$.v.string = $1; | 212 | $$.v.string = $1; |
205 | } | 213 | } |
206 | ; | 214 | ; |
207 | 215 | ||
208 | string : BIND_STRING | 216 | string : BIND_STRING |
209 | | BIND_IDENT | 217 | | BIND_IDENT |
210 | { | ||
211 | $$ = $1.string; | ||
212 | } | ||
213 | ; | 218 | ; |
214 | 219 | ||
215 | ctlsub : ctllist ';' | 220 | ctlsub : ctllist ';' |
216 | { | 221 | { |
217 | $$.type = GRECS_TYPE_LIST; | 222 | $$.type = GRECS_TYPE_LIST; |
223 | $$.locus = @1; | ||
218 | $$.v.list = $1; | 224 | $$.v.list = $1; |
219 | } | 225 | } |
220 | ; | 226 | ; |
@@ -240,7 +246,7 @@ ctllist : value | |||
240 | int | 246 | int |
241 | yyerror(char *s) | 247 | yyerror(char *s) |
242 | { | 248 | { |
243 | grecs_error(&grecs_current_locus, 0, "%s", s); | 249 | grecs_error(&yylloc, 0, "%s", s); |
244 | return 0; | 250 | return 0; |
245 | } | 251 | } |
246 | 252 | ||
@@ -249,7 +255,7 @@ grecs_bind_parser(const char *name, int traceflags) | |||
249 | { | 255 | { |
250 | int rc; | 256 | int rc; |
251 | 257 | ||
252 | if (grecs_bind_new_source(name)) | 258 | if (grecs_bind_new_source(name, NULL)) |
253 | return NULL; | 259 | return NULL; |
254 | yy_flex_debug = traceflags & GRECS_TRACE_LEX; | 260 | yy_flex_debug = traceflags & GRECS_TRACE_LEX; |
255 | yydebug = traceflags & GRECS_TRACE_GRAM; | 261 | yydebug = traceflags & GRECS_TRACE_GRAM; |