X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fliboconfig%2Fparser.y;h=19f58b2b75c4f19b9b196f5d15b85f8f78dd21ac;hb=3faf514fd9b869cadda0f895e14e5036313c7781;hp=8df2c6e5fb230eaed09db85d73e6ad8d5294a819;hpb=04d6a987281022bfffb4d03e60d7d19c8135c4bd;p=collectd.git diff --git a/src/liboconfig/parser.y b/src/liboconfig/parser.y index 8df2c6e5..19f58b2b 100644 --- a/src/liboconfig/parser.y +++ b/src/liboconfig/parser.y @@ -30,6 +30,7 @@ extern int yylineno; extern char *yytext; extern oconfig_item_t *ci_root; +extern char *c_file; %} %start entire_file @@ -45,7 +46,7 @@ extern oconfig_item_t *ci_root; } %token NUMBER -%token TRUE FALSE +%token BTRUE BFALSE %token QUOTED_STRING UNQUOTED_STRING %token SLASH OPENBRAC CLOSEBRAC EOL @@ -64,6 +65,9 @@ extern oconfig_item_t *ci_root; %type statement_list %type entire_file +/* pass an verbose, specific error message to yyerror() */ +%error-verbose + %% string: QUOTED_STRING {$$ = unquote ($1);} @@ -72,8 +76,8 @@ string: argument: NUMBER {$$.value.number = $1; $$.type = OCONFIG_TYPE_NUMBER;} - | TRUE {$$.value.boolean = 1; $$.type = OCONFIG_TYPE_BOOLEAN;} - | FALSE {$$.value.boolean = 0; $$.type = OCONFIG_TYPE_BOOLEAN;} + | BTRUE {$$.value.boolean = 1; $$.type = OCONFIG_TYPE_BOOLEAN;} + | BFALSE {$$.value.boolean = 0; $$.type = OCONFIG_TYPE_BOOLEAN;} | string {$$.value.string = $1; $$.type = OCONFIG_TYPE_STRING;} ; @@ -144,6 +148,19 @@ block: $$.children = $2.statement; $$.children_num = $2.statement_num; } + | block_begin block_end + { + if (strcmp ($1.key, $2) != 0) + { + printf ("block_begin = %s; block_end = %s;\n", $1.key, $2); + yyerror ("Block not closed..\n"); + exit (1); + } + free ($2); $2 = NULL; + $$ = $1; + $$.children = NULL; + $$.children_num = 0; + } ; statement: @@ -187,12 +204,27 @@ entire_file: ci_root->children = $1.statement; ci_root->children_num = $1.statement_num; } + | /* epsilon */ + { + ci_root = malloc (sizeof (oconfig_item_t)); + memset (ci_root, '\0', sizeof (oconfig_item_t)); + ci_root->children = NULL; + ci_root->children_num = 0; + } ; %% static int yyerror (const char *s) { - fprintf (stderr, "Error in line %i near `%s': %s\n", yylineno, yytext, s); + char *text; + + if (*yytext == '\n') + text = ""; + else + text = yytext; + + fprintf (stderr, "Parse error in file `%s', line %i near `%s': %s\n", + c_file, yylineno, text, s); return (-1); } /* int yyerror */