%{ #include #include "cparse.hpp" #include "cparse_def.h" // stuff from lex extern "C" { extern int cparse_lineno; extern char *cparse_text; int cparse_lex(); void cparse_set_in(FILE *fin); } static void cparse_error(const char *s) { printf("Invalid config file (%s): error at line %d, text [%s]\n", s, cparse_lineno, cparse_text); } int level = 0; int ndeact = 0; char *ncomment = NULL; char *nname = NULL; char *nval = NULL; static void print_node() { int i = 0; if (ncomment) { for (i = 0; i <= level; i++) { printf(" "); } printf(" /*%s*/\n", ncomment); } printf("%s", ndeact ? "!" : " "); for (i = 0; i <= level; i++) { printf(" "); } printf("%s", nname); if (nval) { printf(" '%s'", nval); } printf("\n"); } %} %token NODE %token VALUE %token COMMENT %token LEFTB %token RIGHTB %token SYNTAX_ERROR %% input: forest | forest comment ; forest: /* empty */ | forest tree ; tree: node { print_node(); } | node { print_node(); } LEFTB { ++level; } forest RIGHTB { --level; } ; node: nodec { nval = NULL; } | nodec VALUE { nval = $2.str; } ; nodec: NODE { ncomment = NULL; nname = $1.str; ndeact = $1.deactivated; } | COMMENT NODE { ncomment = $1.str; nname = $2.str; ndeact = $2.deactivated; } ; comment: COMMENT | comment COMMENT ; %% int cparse::parse_file(FILE *fin) { cparse_set_in(fin); return cparse_parse(); }