From dded28ea3564271e258d14014dd6089f2bfa7cda Mon Sep 17 00:00:00 2001 From: Jeff Darcy Date: Fri, 1 Oct 2010 13:04:44 -0400 Subject: [PATCH] Fix various issues in policy syntax. Made AND/OR properly associative/recursive. Gave NOT lower precedence than comparisons. Simplified field/link_field parsing. Generally improved whitespace handling. Updated diff to match other changes. --- query.c.diff | 12 ++++++------ query.leg | 38 +++++++++++++++++++------------------- 2 files changed, 25 insertions(+), 25 deletions(-) diff --git a/query.c.diff b/query.c.diff index 8a882bc..22b8f7e 100644 --- a/query.c.diff +++ b/query.c.diff @@ -1,6 +1,6 @@ ---- query-orig.c 2010-09-23 16:19:31.543661275 +0200 -+++ query.c 2010-09-23 16:19:31.547897591 +0200 -@@ -537,7 +537,7 @@ YY_LOCAL(int) yyrefill(void) +--- query-orig.c 2010-10-01 12:56:20.000000000 -0400 ++++ query.c 2010-10-01 12:56:20.000000000 -0400 +@@ -538,7 +538,7 @@ YY_LOCAL(int) yyrefill(void) while (yybuflen - yypos < 512) { yybuflen *= 2; @@ -9,7 +9,7 @@ } YY_INPUT((yybuf + yypos), yyn, (yybuflen - yypos)); if (!yyn) return 0; -@@ -602,7 +602,7 @@ YY_LOCAL(void) yyDo(yyaction action, int +@@ -603,7 +603,7 @@ YY_LOCAL(void) yyDo(yyaction action, int while (yythunkpos >= yythunkslen) { yythunkslen *= 2; @@ -18,7 +18,7 @@ } yythunks[yythunkpos].begin= begin; yythunks[yythunkpos].end= end; -@@ -620,7 +620,7 @@ YY_LOCAL(int) yyText(int begin, int end) +@@ -621,7 +621,7 @@ YY_LOCAL(int) yyText(int begin, int end) while (yytextlen < (yyleng - 1)) { yytextlen *= 2; @@ -27,7 +27,7 @@ } memcpy(yytext, yybuf + begin, yyleng); } -@@ -1154,13 +1154,13 @@ YY_PARSE(int) YYPARSEFROM(yyrule yystart +@@ -1159,13 +1159,13 @@ YY_PARSE(int) YYPARSEFROM(yyrule yystart if (!yybuflen) { yybuflen= 1024; diff --git a/query.leg b/query.leg index 4a47943..d04429f 100644 --- a/query.leg +++ b/query.leg @@ -361,7 +361,8 @@ _print_value (const value_t *v, int level) case T_LINK: printf("%*sLINK\n",level,""); _print_value(v->as_tree.left,level+2); - printf("%*sDEST FIELD%s\n",level+2,"",(char *)v->as_tree.right); + printf("%*sDEST FIELD %s\n",level+2,"", + (char *)v->as_tree.right); break; default: printf("%*sUNKNOWN %d\n",level,"",v->type); @@ -463,32 +464,31 @@ eval (const value_t *v, getter_t *oget, getter_t *sget) Stmt = - BoolExpr - EOL { *cur_expr = $$; } | ( !EOL . )* EOL -BoolExpr = l:CompExpr ( - ( - AND - r:CompExpr ) +BoolExpr = l:NotExpr + ( ( - AND - r:NotExpr ) { $$ = l = make_tree(T_AND,l,r); } - ( - OR - r:CompExpr ) - { $$ = l = make_tree(T_OR,l,r); } -)* - + | ( - OR - r:NotExpr ) + { $$ = l = make_tree(T_OR,l,r); } )* -CompExpr = l:Unary - ( ( - LESS - r:Unary { $$ = make_comp(C_LESSTHAN,l,r); } ) - | ( - LESS EQUAL - r:Unary { $$ = make_comp(C_LESSOREQ,l,r); } ) - | ( - EQUAL EQUAL - r:Unary { $$ = make_comp(C_EQUAL,l,r); } ) - | ( - NOT EQUAL - r:Unary { $$ = make_comp(C_DIFFERENT,l,r); } ) - | ( - GREATER EQUAL - r:Unary { $$ = make_comp(C_GREATEROREQ,l,r); } ) - | ( - GREATER - r:Unary { $$ = make_comp(C_GREATERTHAN,l,r); } ) )? - +NotExpr = CompExpr - + | NOT - e:CompExpr - { $$ = make_tree(T_NOT,e,NULL); } -Unary = Atom - - | NOT - e:Unary - { $$ = make_tree(T_NOT,e,NULL); } +CompExpr = l:Atom + ( ( - LESS - r:Atom { $$ = make_comp(C_LESSTHAN,l,r); } ) + | ( - LESS EQUAL - r:Atom { $$ = make_comp(C_LESSOREQ,l,r); } ) + | ( - EQUAL EQUAL - r:Atom { $$ = make_comp(C_EQUAL,l,r); } ) + | ( - NOT EQUAL - r:Atom { $$ = make_comp(C_DIFFERENT,l,r); } ) + | ( - GREATER EQUAL - r:Atom { $$ = make_comp(C_GREATEROREQ,l,r); } ) + | ( - GREATER - r:Atom { $$ = make_comp(C_GREATERTHAN,l,r); } ) )? -Atom = ( Literal | LinkField | ParenExpr ) - +Atom = ( Literal | LinkField | ParenExpr ) Literal = NUMBER | STRING | TIME -LinkField = f:Field ( DOT i:ID { $$ = f = make_link(f,i); } )* - +LinkField = f:Field ( DOT i:ID { $$ = f = make_link(f,i); } )* -Field = DOLLAR i:ID - { $$ = make_string((char *)i,T_OFIELD); } - | WAFFLE i:ID - { $$ = make_string((char *)i,T_SFIELD); } +Field = DOLLAR i:ID { $$ = make_string((char *)i,T_OFIELD); } + | WAFFLE i:ID { $$ = make_string((char *)i,T_SFIELD); } ParenExpr = OPEN - v:BoolExpr - CLOSE - { $$ = v; } -- 2.11.4.GIT