diff options
author | Ondrej Zajicek <santiago@crfreenet.org> | 2011-03-23 12:49:53 +0100 |
---|---|---|
committer | Ondrej Zajicek <santiago@crfreenet.org> | 2011-03-23 12:49:53 +0100 |
commit | 26d92bb8921ac4e022cdc88bde8fc7bc617f8766 (patch) | |
tree | 5e900b466e46e1848b4d2bd98a5894cf6214b08b | |
parent | 6bcef22580010aec695fb2b559c7b33ee00261b0 (diff) | |
download | bird-26d92bb8921ac4e022cdc88bde8fc7bc617f8766.tar bird-26d92bb8921ac4e022cdc88bde8fc7bc617f8766.zip |
A hack to distinguish if..else from else: in case.
The old BIRD grammar needs two lookaheads to distinguish if..else from
else: in case, which caused the parser to fail on some combinations of
both expressions.
This patch replaces two tokens 'else' ':' by one token 'else:' to fix
that.
-rw-r--r-- | conf/cf-lex.l | 5 | ||||
-rw-r--r-- | conf/confbase.Y | 2 | ||||
-rw-r--r-- | doc/bird.sgml | 2 | ||||
-rw-r--r-- | filter/config.Y | 4 | ||||
-rw-r--r-- | filter/test.conf | 13 |
5 files changed, 16 insertions, 10 deletions
diff --git a/conf/cf-lex.l b/conf/cf-lex.l index c6e9a0e..828dfd2 100644 --- a/conf/cf-lex.l +++ b/conf/cf-lex.l @@ -137,6 +137,11 @@ WHITE [ \t] return NUM; } +else: { + /* Hack to distinguish if..else from else: in case */ + return ELSECOL; +} + ({ALPHA}{ALNUM}*|[']({ALNUM}|[-])*[']) { if(*yytext == '\'') { yytext[yyleng-1] = 0; diff --git a/conf/confbase.Y b/conf/confbase.Y index ce844ba..68960c2 100644 --- a/conf/confbase.Y +++ b/conf/confbase.Y @@ -48,7 +48,7 @@ CF_DECLS struct timeformat *tf; } -%token END CLI_MARKER INVALID_TOKEN +%token END CLI_MARKER INVALID_TOKEN ELSECOL %token GEQ LEQ NEQ AND OR %token PO PC %token <i> NUM ENUM diff --git a/doc/bird.sgml b/doc/bird.sgml index 7b6e97a..b5bdb93 100644 --- a/doc/bird.sgml +++ b/doc/bird.sgml @@ -837,7 +837,7 @@ prefix and prefix (returning true if first prefix is more specific than second o <M>command_1</M>; <M>command_2</M>; <M>...</M> }</cf> instead of either command. The <cf>else</cf> clause may be omitted. If the <cf><m>boolean expression</m></cf> is true, <cf><m>command1</m></cf> is executed, otherwise <cf><m>command2</m></cf> is executed. -<p>The <cf>case</cf> is similar to case from Pascal. Syntax is <cf>case <m/expr/ { else | +<p>The <cf>case</cf> is similar to case from Pascal. Syntax is <cf>case <m/expr/ { else: | <m/num_or_prefix [ .. num_or_prefix]/: <m/statement/ ; [ ... ] }</cf>. The expression after <cf>case</cf> can be of any type which can be on the left side of the ˜ operator and anything that could be a member of a set is allowed before <cf/:/. Multiple commands are allowed without <cf/{}/ grouping. diff --git a/filter/config.Y b/filter/config.Y index 8ff2046..b9aa67f 100644 --- a/filter/config.Y +++ b/filter/config.Y @@ -305,11 +305,11 @@ switch_body: /* EMPTY */ { $$ = NULL; } $$->data = $4; $$->left = $1; } - | switch_body ELSE ':' cmds { + | switch_body ELSECOL cmds { $$ = f_new_tree(); $$->from.type = T_VOID; $$->to.type = T_VOID; - $$->data = $4; + $$->data = $3; $$->left = $1; } ; diff --git a/filter/test.conf b/filter/test.conf index 40fff19..6d7a708 100644 --- a/filter/test.conf +++ b/filter/test.conf @@ -27,14 +27,15 @@ int local1; int local2; int i; { - printn "Function callme called arguments ", arg1, " and ", arg2, ":" ; + printn "Function callme called arguments ", arg1, " and ", arg2, ": " ; i = arg2; case arg1 { - 2: print "dva"; print "jeste jednou dva"; - 3 .. 5: print "tri az pet"; - else: print "neco jineho"; - } + 2: printn "dva, "; printn "jeste jednou dva"; + 3 .. 5: if arg2 < 3 then printn "tri az pet"; + else: printn "neco jineho"; + } + print; } function fifteen() @@ -247,7 +248,7 @@ string s; callme ( 2, 2 ); callme ( 2, 2 ); callme ( 3, 2 ); - callme ( 4, 2 ); + callme ( 4, 4 ); callme ( 7, 2 ); i = fifteen(); |