aboutsummaryrefslogtreecommitdiff
path: root/src/bind-gram.y
diff options
context:
space:
mode:
authorSergey Poznyakoff <gray@gnu.org.ua>2011-06-26 15:18:29 +0300
committerSergey Poznyakoff <gray@gnu.org.ua>2011-06-26 21:23:42 +0300
commit440771ca0056eb20396e24f03d349a75ee1c9d22 (patch)
tree3ec58a85e96d21a855ad3dcefaa8adc51039fc38 /src/bind-gram.y
parent4c1959a4848c30206de3be4b16bdf04b650daae8 (diff)
downloadgrecs-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.y68
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
31static struct grecs_node *parse_tree; 32static struct grecs_node *parse_tree;
32extern int yy_flex_debug; 33extern int yy_flex_debug;
33extern int grecs_bind_new_source(const char *name); 34extern int grecs_bind_new_source(const char *name, grecs_locus_t *loc);
34extern void grecs_bind_close_sources(void); 35extern void grecs_bind_close_sources(void);
35 36
36static struct grecs_value *stmtlist_to_value(struct grecs_node *node); 37static 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
63input : maybe_stmtlist 62input : 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
103simple : BIND_IDENT vallist ';' 101simple : 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
133block : BIND_IDENT tag '{' maybe_stmtlist '}' ';' 135block : 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
201value : string 208value : 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
208string : BIND_STRING 216string : BIND_STRING
209 | BIND_IDENT 217 | BIND_IDENT
210 {
211 $$ = $1.string;
212 }
213 ; 218 ;
214 219
215ctlsub : ctllist ';' 220ctlsub : 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
240int 246int
241yyerror(char *s) 247yyerror(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;

Return to:

Send suggestions and report system problems to the System administrator.