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.
This commit is contained in:
Akim Demaille
2008-08-21 22:39:01 +02:00
parent c944f7f22d
commit 1a7a65f9d5
3 changed files with 38 additions and 10 deletions

View File

@@ -1,3 +1,11 @@
2008-11-11 Akim Demaille <demaille@gostai.com>
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 <demaille@gostai.com> 2008-11-11 Akim Demaille <demaille@gostai.com>
Simplify lalr1.cc since %defines is mandatory. Simplify lalr1.cc since %defines is mandatory.

View File

@@ -8620,6 +8620,7 @@ exp: exp '+' exp @{ $$ = $1 + $3; @}
| exp '-' exp @{ $$ = $1 - $3; @} | exp '-' exp @{ $$ = $1 - $3; @}
| exp '*' exp @{ $$ = $1 * $3; @} | exp '*' exp @{ $$ = $1 * $3; @}
| exp '/' exp @{ $$ = $1 / $3; @} | exp '/' exp @{ $$ = $1 / $3; @}
| '(' exp ')' @{ $$ = $2; @}
| "identifier" @{ $$ = driver.variables[*$1]; delete $1; @} | "identifier" @{ $$ = driver.variables[*$1]; delete $1; @}
| "number" @{ $$ = $1; @}; | "number" @{ $$ = $1; @};
%% %%
@@ -8724,7 +8725,7 @@ It is convenient to use a typedef to shorten
typedef yy::calcxx_parser::token token; typedef yy::calcxx_parser::token token;
%@} %@}
/* Convert ints to the actual type of tokens. */ /* 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; ":=" return token::ASSIGN;
@{int@} @{ @{int@} @{
errno = 0; errno = 0;

View File

@@ -13,17 +13,26 @@ number=1
# Exit status of this script. # Exit status of this script.
exit=true exit=true
# run EXPECTED-EXIT-STATUS [PARSER-OPTIONS] # run EXPECTED-EXIT-STATUS EXPECTED-OUTPUT [PARSER-OPTIONS]
# ----------------------------------------- # ---------------------------------------------------------
run () run ()
{ {
# Effective and expected exit status. # Effective and expected exit status.
local sta_exp=$1 local sta_exp=$1
shift shift
./calc++ "$@" input local out_exp=$1
shift
./calc++ "$@" input >out_eff
local sta_eff=$? local sta_eff=$?
local out_eff=`cat out_eff`
if test $sta_eff -eq $sta_exp; then 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 else
printf "$me: FAIL: %2d (expected status: %d, effective: %d\n" \ printf "$me: FAIL: %2d (expected status: %d, effective: %d\n" \
$number $sta_exp $sta_eff $number $sta_exp $sta_eff
@@ -39,22 +48,32 @@ c := 3
d := a + b * c d := a + b * c
d d
EOF EOF
run 0 run 0 7
run 0 -p run 0 7 -p
cat >input <<EOF
a := 1
b := 2
c := 3
d := (a + b) * c
d
EOF
run 0 9
cat >input <<EOF cat >input <<EOF
a := 1 a := 1
d := a + b * c d := a + b * c
EOF EOF
run 1 input run 1 '' input
cat >input <<EOF cat >input <<EOF
toto := 1 toto := 1
toto toto
EOF EOF
run 0 -s run 0 1 -s
rm input rm input out_eff
$exit $exit