summaryrefslogtreecommitdiffabout
path: root/src/bind-gram.y
authorSergey Poznyakoff <gray@gnu.org.ua>2011-06-26 12:18:29 (GMT)
committer Sergey Poznyakoff <gray@gnu.org.ua>2011-06-26 18:23:42 (GMT)
commit440771ca0056eb20396e24f03d349a75ee1c9d22 (patch) (side-by-side diff)
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') (more/less context) (ignore whitespace changes)
-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 @@
# include <config.h>
#endif
#include <grecs.h>
-#include <grecs-gram.h>
+#include <grecs-locus.h>
+#include <bind-gram.h>
#include <stdlib.h>
#include <stdarg.h>
#include <string.h>
@@ -30,17 +31,16 @@ int yyerror(char *s);
static struct grecs_node *parse_tree;
extern int yy_flex_debug;
-extern int grecs_bind_new_source(const char *name);
+extern int grecs_bind_new_source(const char *name, grecs_locus_t *loc);
extern void grecs_bind_close_sources(void);
static struct grecs_value *stmtlist_to_value(struct grecs_node *node);
%}
+%error-verbose
+%locations
+
%union {
- struct {
- grecs_locus_t locus;
- char *string;
- } ident;
char *string;
grecs_value_t svalue, *pvalue;
struct grecs_list *list;
@@ -49,8 +49,7 @@ static struct grecs_value *stmtlist_to_value(struct grecs_node *node);
struct { struct grecs_node *head, *tail; } node_list;
}
-%token <ident> BIND_IDENT BIND_CONTROLS
-%token <string> BIND_STRING
+%token <string> BIND_STRING BIND_IDENT BIND_CONTROLS
%type <string> string
%type <svalue> value ctlsub
%type <pvalue> vallist tag
@@ -62,8 +61,7 @@ static struct grecs_value *stmtlist_to_value(struct grecs_node *node);
input : maybe_stmtlist
{
- parse_tree = grecs_node_create(grecs_node_root,
- &grecs_current_locus);
+ parse_tree = grecs_node_create(grecs_node_root, &@1);
parse_tree->v.texttab = grecs_text_table();
grecs_node_bind(parse_tree, $1, 1);
}
@@ -102,38 +100,44 @@ stmt : simple
simple : BIND_IDENT vallist ';'
{
- if (strcmp($1.string, "include") == 0 &&
+ if (strcmp($1, "include") == 0 &&
$2->type == GRECS_TYPE_STRING) {
- grecs_bind_new_source($2->v.string);
+ grecs_bind_new_source($2->v.string, &@1);
$$ = NULL;
} else {
- $$ = grecs_node_create(grecs_node_stmt, &$1.locus);
- $$->ident = $1.string;
+ $$ = grecs_node_create_points(grecs_node_stmt,
+ @1.beg, @2.end);
+ $$->ident = $1;
+ $$->idloc = @1;
$$->v.value = $2;
}
}
| string ';'
{
- $$ = grecs_node_create(grecs_node_stmt,
- &grecs_current_locus);
+ $$ = grecs_node_create(grecs_node_stmt, &@1);
$$->ident = $1;
+ $$->idloc = @1;
$$->v.value = NULL;
}
| '!' string ';'
{
- $$ = grecs_node_create(grecs_node_stmt,
- &grecs_current_locus);
- $$->ident = grecs_strdup("!");
- $$->v.value = grecs_malloc(sizeof($$->v.value[0]));
- $$->v.value->type = GRECS_TYPE_STRING;
- $$->v.value->v.string = $2;
+ $$ = grecs_node_create_points(grecs_node_stmt,
+ @1.beg, @2.end);
+ $$->ident = grecs_strdup("!");
+ $$->idloc = @1;
+ $$->v.value = grecs_malloc(sizeof($$->v.value[0]));
+ $$->v.value->type = GRECS_TYPE_STRING;
+ $$->v.value->locus = @2;
+ $$->v.value->v.string = $2;
}
;
block : BIND_IDENT tag '{' maybe_stmtlist '}' ';'
{
- $$ = grecs_node_create(grecs_node_block, &$1.locus);
- $$->ident = $1.string;
+ $$ = grecs_node_create_points(grecs_node_block,
+ @1.beg, @5.end);
+ $$->ident = $1;
+ $$->idloc = @1;
$$->v.value = $2;
grecs_node_bind($$, $4, 1);
}
@@ -151,8 +155,10 @@ block : BIND_IDENT tag '{' maybe_stmtlist '}' ';'
(127.0.0.1, 127.0.0.2), keys, (rndc-key))
*/
{
- $$ = grecs_node_create(grecs_node_stmt, &$1.locus);
- $$->ident = $1.string;
+ $$ = grecs_node_create_points(grecs_node_stmt,
+ @1.beg, @4.end);
+ $$->ident = $1;
+ $$->idloc = @1;
$$->v.value = grecs_value_ptr_from_static(&$3);
}
;
@@ -176,6 +182,7 @@ vallist : vlist
$$ = grecs_malloc(sizeof($$[0]));
$$->type = GRECS_TYPE_ARRAY;
+ $$->locus = @1;
$$->v.arg.c = n;
$$->v.arg.v = grecs_calloc(n,
sizeof($$->v.arg.v[0]));
@@ -201,20 +208,19 @@ vlist : value
value : string
{
$$.type = GRECS_TYPE_STRING;
+ $$.locus = @1;
$$.v.string = $1;
}
;
string : BIND_STRING
| BIND_IDENT
- {
- $$ = $1.string;
- }
;
ctlsub : ctllist ';'
{
$$.type = GRECS_TYPE_LIST;
+ $$.locus = @1;
$$.v.list = $1;
}
;
@@ -240,7 +246,7 @@ ctllist : value
int
yyerror(char *s)
{
- grecs_error(&grecs_current_locus, 0, "%s", s);
+ grecs_error(&yylloc, 0, "%s", s);
return 0;
}
@@ -249,7 +255,7 @@ grecs_bind_parser(const char *name, int traceflags)
{
int rc;
- if (grecs_bind_new_source(name))
+ if (grecs_bind_new_source(name, NULL))
return NULL;
yy_flex_debug = traceflags & GRECS_TRACE_LEX;
yydebug = traceflags & GRECS_TRACE_GRAM;

Return to:

Send suggestions and report system problems to the System administrator.