examples: bistromathic: demonstrate the use of yyexpected_tokens

Let's use GNU readline and its TAB autocompletion to demonstrate the
use of yyexpected_tokens.

This shows a number of weaknesses in our current approach:

- some macros (yyssp, etc.) from push parsers "leak" in user code, we
  need to undefine them

- the context needed by yyexpected_tokens does not need the token,
  yypstate actually suffices

- yypstate is not properly setup when first allocated, which results
  in a crash of yyexpected_tokens if fired before a first token was
  read.  We should move initialization from yypush_parse into
  yypstate_new.

* examples/c/bistromathic/parse.y (yylex): Take input as a string, not
a file.
(EXIT): New token.
(input): Adjust to work only on a line.
(line): Remove.
(symbol_count, process_line, expected_tokens, completion)
(init_readline): New.
* examples/c/bistromathic/bistromathic.test: Adjust expectations.
This commit is contained in:
Akim Demaille
2020-02-29 17:51:22 +01:00
parent b269a45fa4
commit 5789f9d91e
6 changed files with 238 additions and 60 deletions

View File

@@ -18,47 +18,64 @@
cat >input <<EOF
1+2*3
EOF
run 0 7
run 0 '> 1+2*3
7
> '
cat >input <<EOF
(1+2) * 3
EOF
run 0 9
run -noerr 0 9 -p
run 0 '> (1+2) * 3
9
> '
run -noerr 0 '> (1+2) * 3
9
> ' -p
cat >input <<EOF
a = 256
sqrt (a)
EOF
run 0 '256
16'
run 0 '> a = 256
256
> sqrt (a)
16
> '
cat >input <<EOF
a = .16
b = 10 ^ 2
sqrt (a * b)
EOF
run 0 '0.16
run 0 '> a = .16
0.16
> b = 10 ^ 2
100
4'
> sqrt (a * b)
4
> '
cat >input <<EOF
*
EOF
run 0 'err: 1.1: syntax error: expected end of file or - or ( or end of line or double precision number or function or variable before *'
run 0 '> *
> err: 1.1: syntax error: expected end of file or - or ( or exit or double precision number or function or variable before *'
cat >input <<EOF
1 + 2 * * 3
EOF
run 0 'err: 1.9: syntax error: expected - or ( or double precision number or function or variable before *'
run 0 '> 1 + 2 * * 3
> err: 1.9: syntax error: expected - or ( or double precision number or function or variable before *'
cat >input <<EOF
100%
EOF
run 0 '100
err: 1.4: error: invalid character'
run 0 '> 100%
100
> err: 1.4: error: invalid character'
cat >input <<EOF
1 / 0
EOF
run 0 'err: 1.1-5: error: division by zero'
run 0 '> 1 / 0
> err: 1.1-5: error: division by zero'