From 62e95c10ba84871fd5ad97fccd75664b07620013 Mon Sep 17 00:00:00 2001 From: Rainer Gerhards Date: Sat, 2 Jul 2011 18:32:35 +0200 Subject: milestone: some support for rules in grammar --- grammar/rscript.l | 118 +++++++++++++++++++++--------------------------------- grammar/rscript.y | 33 +++++++++++---- grammar/utils.c | 12 ++++++ grammar/utils.h | 3 ++ 4 files changed, 85 insertions(+), 81 deletions(-) diff --git a/grammar/rscript.l b/grammar/rscript.l index 73843692..ccc39a2f 100644 --- a/grammar/rscript.l +++ b/grammar/rscript.l @@ -43,82 +43,60 @@ static int preCommentState; %% /* keywords */ -"if" { printf("IF\n"); - BEGIN EXPR; - } -"then" { printf("THEN\n"); - BEGIN INITIAL; - } -"or" { printf("OR\n"); } -"and" { printf("AND\n"); } -"not" { printf("NOT\n"); } -"(" { printf("LPAREN\n"); } -")" { printf("RPAREN\n"); } -"==" { printf("==\n"); } -"<=" { printf("<=\n"); } -">=" { printf(">=\n"); } +"if" { printf("IF\n"); BEGIN EXPR; } +"then" { printf("THEN\n"); BEGIN INITIAL; } +"or" { printf("OR\n"); } +"and" { printf("AND\n"); } +"not" { printf("NOT\n"); } +"(" { printf("LPAREN\n"); } +")" { printf("RPAREN\n"); } +"==" { printf("==\n"); } +"<=" { printf("<=\n"); } +">=" { printf(">=\n"); } "!=" | -"<>" { printf("!=\n"); } -"<" { printf("<\n"); } -">" { printf(">\n"); } -"contains" { printf("CONTAINS\n"); } -"contains_i" { printf("CONTAINS_I\n"); } -"startswith" { printf("STARTSWITH\n"); } -"startswith_i" { printf("STARTSWITH_I\n"); } --?0[0-7]+ { printf("NUMBER (oct) %s\n", yytext); } --?0x[0-7a-f] { printf("NUMBER (hex) %s\n", yytext); } --?([1-9][0-9]*|0) { printf("NUMBER (dec) %s\n", yytext); } -\$[$!]{0,1}[a-z][a-z0-9\-_\.]* { printf("VARNAME: '%s'\n", yytext); } -\'([^'\\]|\\['])*\' { printf("EXPR string: -%s-\n", yytext); } +"<>" { printf("!=\n"); } +"<" { printf("<\n"); } +">" { printf(">\n"); } +"contains" { printf("CONTAINS\n"); } +"contains_i" { printf("CONTAINS_I\n"); } +"startswith" { printf("STARTSWITH\n"); } +"startswith_i" { printf("STARTSWITH_I\n"); } +-?0[0-7]+ { printf("NUMBER (oct) %s\n", yytext); } +-?0x[0-7a-f] { printf("NUMBER (hex) %s\n", yytext); } +-?([1-9][0-9]*|0) { printf("NUMBER (dec) %s\n", yytext); } +\$[$!]{0,1}[a-z][a-z0-9\-_\.]* { printf("VARNAME: '%s'\n", yytext); } +\'([^'\\]|\\['])*\' { printf("EXPR string: -%s-\n", yytext); } [ \t\n] -. { printf("invalid char in expr: %s\n", yytext); } -"&" { printf("AMPER\n"); } -"ruleset" { printf("RULESET\n"); } +. { printf("invalid char in expr: %s\n", yytext); } +"&" { return '&'; } +"ruleset" { printf("RULESET\n"); } -"global"[ \n\t]*"(" { yylval.objType = CNFOBJ_GLOBAL; - BEGIN INOBJ; return BEGINOBJ; } -"input"[ \n\t]*"(" { yylval.objType = CNFOBJ_INPUT; - BEGIN INOBJ; return BEGINOBJ; } -"module"[ \n\t]*"(" { yylval.objType = CNFOBJ_MODULE; - BEGIN INOBJ; return BEGINOBJ; } -"action"[ \n\t]*"(" { yylval.objType = CNFOBJ_ACTION; - BEGIN INOBJ; return BEGINOBJ; } +"global"[ \n\t]*"(" { yylval.objType = CNFOBJ_GLOBAL; + BEGIN INOBJ; return BEGINOBJ; } +"input"[ \n\t]*"(" { yylval.objType = CNFOBJ_INPUT; + BEGIN INOBJ; return BEGINOBJ; } +"module"[ \n\t]*"(" { yylval.objType = CNFOBJ_MODULE; + BEGIN INOBJ; return BEGINOBJ; } +"action"[ \n\t]*"(" { BEGIN INOBJ; return BEGIN_ACTION; } ^[ \t]*:\$?[a-z]+[ ]*,[ ]*!?[a-z]+[ ]*,[ ]*\".*\" { - printf("PROP-FILT: '%s'\n", yytext); - } - -^[ \t]*[,\*a-z]+\.[,!=;\.\*a-z]+ { printf("PRI-FILT: '%s'\n", yytext); + printf("PROP-FILT: '%s'\n", yytext); } +^[ \t]*[,\*a-z]+\.[,!=;\.\*a-z]+ { printf("token prifilt '%s'\n", yytext); yylval.s = strdup(yytext); return PRIFILT; } + "*" | \/[^*][^\n]* | -[\|\.\-:][^\n]+ { printf("old style action: '%s'\n", yytext); - } - +[\|\.\-:][^\n]+ { printf("toke legacy_action '%s'\n", yytext);yylval.s = strdup(yytext); return LEGACY_ACTION; } [a-z0-9_\-\+]+ { printf("name: '%s'\n", yytext); } - -")" { printf("OBJ end\n"); - BEGIN INITIAL; - return ENDOBJ; - } -[a-z][a-z0-9_\.]* { printf("INOBJ: name '%s'\n", yytext); - yylval.estr = es_newStrFromCStr(yytext, yyleng); - return NAME; - } -"=" { printf("INOBJ: equals (%s)\n", yytext); - return(yytext[0]); - } +")" { BEGIN INITIAL; return ENDOBJ; } +[a-z][a-z0-9_\.]* { yylval.estr = es_newStrFromCStr(yytext, yyleng); + return NAME; } +"=" { return(yytext[0]); } \"([^"\\]|\\['"?\\abfnrtv]|\\[0-7]{1,3})*\" { - printf("INOBJ: value '%s'\n", yytext); yylval.estr = es_newStrFromCStr(yytext+1, yyleng-2); - return VALUE; - } -"/*" { preCommentState = YY_START; - BEGIN COMMENT; - } -"/*" { preCommentState = YY_START; - BEGIN COMMENT; - } + return VALUE; } +"/*" { preCommentState = YY_START; BEGIN COMMENT; } +"/*" { preCommentState = YY_START; BEGIN COMMENT; } "*/" { BEGIN preCommentState; } ([^*]|\n)+|. @@ -127,14 +105,8 @@ static int preCommentState; . { printf("INOBJ: invalid char '%s'\n", yytext); } /* CFSYSLINE is valid in all modes */ -\$[a-z]+.*$ { printf("CFSYSLINE: '%s'\n", yytext); - yylval.s = yytext; - return CFSYSLINE; - } -\$[a-z]+.*$ { printf("CFSYSLINE: '%s'\n", yytext); - yylval.s = yytext; - return CFSYSLINE; - } +\$[a-z]+.*$ { yylval.s = yytext; return CFSYSLINE; } +\$[a-z]+.*$ { yylval.s = yytext; return CFSYSLINE; } \#.*\n /* skip comments in input */ [\n\t ] /* drop whitespace */ diff --git a/grammar/rscript.y b/grammar/rscript.y index 6954d38d..5bd8f0f9 100644 --- a/grammar/rscript.y +++ b/grammar/rscript.y @@ -19,30 +19,47 @@ %token BEGINOBJ %token ENDOBJ %token CFSYSLINE +%token BEGIN_ACTION +%token LEGACY_ACTION +%token PRIFILT +%token PROPFILT %type nv nvlst %type obj +%type actlst +%type act %% - /* conf: | conf global | conf action*/ -conf: +conf: /* empty (to end recursion) */ | obj conf | cfsysline conf + | rule conf -obj: BEGINOBJ nvlst ENDOBJ { printf("XXXX: global processed\n"); - $$ = cnfobjNew($1, $2); +obj: BEGINOBJ nvlst ENDOBJ { $$ = cnfobjNew($1, $2); cnfobjPrint($$); cnfobjDestruct($$); } +obj: BEGIN_ACTION nvlst ENDOBJ { struct cnfobj *t = cnfobjNew(CNFOBJ_ACTION, $2); + cnfobjPrint(t); + cnfobjDestruct(t); + printf("XXXX: this is an new-style action!\n"); + } cfsysline: CFSYSLINE { printf("XXXX: processing CFSYSLINE: %s\n", $1); } nvlst: { $$ = NULL; } - | nvlst nv { printf("XXXX: nvlst $1: %p, $2 %p\n", $1,$2); - $2->next = $1; - $$ = $2; - } + | nvlst nv { $2->next = $1; $$ = $2; } nv: NAME '=' VALUE { $$ = nvlstNew($1, $3); } +rule: PRIFILT actlst { printf("PRIFILT: %s\n", $1); free($1); } + | PROPFILT actlst + +actlst: act { printf("action (end actlst) %s\n", $1);$$=$1; } + | actlst '&' act { printf("in actionlist %s\n", $3); } +act: BEGIN_ACTION nvlst ENDOBJ { $$ = "obj"; } + | LEGACY_ACTION { printf("legacy action: '%s'\n", $1); + /*free($1);*/ + $$ = $1;} + %% int yyerror(char *s) { diff --git a/grammar/utils.c b/grammar/utils.c index ccc9fbc7..a505704f 100644 --- a/grammar/utils.c +++ b/grammar/utils.c @@ -118,3 +118,15 @@ cnfobjPrint(struct cnfobj *o) printf("obj: '%s'\n", cnfobjType2str(o->objType)); nvlstPrint(o->nvlst); } + +/* debug helper */ +void +cstrPrint(char *text, es_str_t *estr) +{ + char *str; + printf("in cstrPrint, estr %p\n", estr); + str = es_str2cstr(estr, NULL); + printf("2: in cstrPrint, estr %p\n", estr); + printf("%s%s", text, str); + free(str); +} diff --git a/grammar/utils.h b/grammar/utils.h index 45176a50..66b05647 100644 --- a/grammar/utils.h +++ b/grammar/utils.h @@ -49,4 +49,7 @@ void nvlstPrint(struct nvlst *lst); struct cnfobj* cnfobjNew(enum cnfobjType objType, struct nvlst *lst); void cnfobjDestruct(struct cnfobj *o); void cnfobjPrint(struct cnfobj *o); + +/* debug helper */ +void cstrPrint(char *text, es_str_t *estr); #endif -- cgit v1.2.3