From 1a7a65f9d5aec5eda92d92b2148fee2e6f0c4199 Mon Sep 17 00:00:00 2001 From: Akim Demaille Date: Thu, 21 Aug 2008 22:39:01 +0200 Subject: [PATCH] Support parens in calc++. * doc/bison.texinfo (Calc++ Scanner, Calc++ Parser): Support parens. * examples/calc++/test (run): Check the expected output. Adjust callers. Check parens too. --- ChangeLog | 8 ++++++++ doc/bison.texinfo | 3 ++- examples/calc++/test | 37 ++++++++++++++++++++++++++++--------- 3 files changed, 38 insertions(+), 10 deletions(-) diff --git a/ChangeLog b/ChangeLog index 7931aaff..e03a1043 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2008-11-11 Akim Demaille + + Support parens in calc++. + * doc/bison.texinfo (Calc++ Scanner, Calc++ Parser): Support parens. + * examples/calc++/test (run): Check the expected output. + Adjust callers. + Check parens too. + 2008-11-11 Akim Demaille Simplify lalr1.cc since %defines is mandatory. diff --git a/doc/bison.texinfo b/doc/bison.texinfo index ae3dc4b0..70f62672 100644 --- a/doc/bison.texinfo +++ b/doc/bison.texinfo @@ -8620,6 +8620,7 @@ exp: exp '+' exp @{ $$ = $1 + $3; @} | exp '-' exp @{ $$ = $1 - $3; @} | exp '*' exp @{ $$ = $1 * $3; @} | exp '/' exp @{ $$ = $1 / $3; @} + | '(' exp ')' @{ $$ = $2; @} | "identifier" @{ $$ = driver.variables[*$1]; delete $1; @} | "number" @{ $$ = $1; @}; %% @@ -8724,7 +8725,7 @@ It is convenient to use a typedef to shorten typedef yy::calcxx_parser::token token; %@} /* Convert ints to the actual type of tokens. */ -[-+*/] return yy::calcxx_parser::token_type (yytext[0]); +[-+*/()] return yy::calcxx_parser::token_type (yytext[0]); ":=" return token::ASSIGN; @{int@} @{ errno = 0; diff --git a/examples/calc++/test b/examples/calc++/test index b6f0942c..2aa917bc 100755 --- a/examples/calc++/test +++ b/examples/calc++/test @@ -13,17 +13,26 @@ number=1 # Exit status of this script. exit=true -# run EXPECTED-EXIT-STATUS [PARSER-OPTIONS] -# ----------------------------------------- +# run EXPECTED-EXIT-STATUS EXPECTED-OUTPUT [PARSER-OPTIONS] +# --------------------------------------------------------- run () { # Effective and expected exit status. local sta_exp=$1 shift - ./calc++ "$@" input + local out_exp=$1 + shift + ./calc++ "$@" input >out_eff local sta_eff=$? + local out_eff=`cat out_eff` if test $sta_eff -eq $sta_exp; then - printf "$me: PASS: %2d\n" $number + if test "$out_eff" = "$out_exp"; then + printf "$me: PASS: %2d\n" $number + else + printf "$me: FAIL: %2d (expected output: %s, effective: %s\n" \ + $number "$out_exp" "$out_eff" + exit=false + fi else printf "$me: FAIL: %2d (expected status: %d, effective: %d\n" \ $number $sta_exp $sta_eff @@ -39,22 +48,32 @@ c := 3 d := a + b * c d EOF -run 0 -run 0 -p +run 0 7 +run 0 7 -p + + +cat >input <input <input <