yacc.c: add support for parse.error detailed

"detailed" error messages are almost like "verbose", except that we
don't double escape them, they don't get inner quotes, we don't use
yytnamerr, and we hide the table.

"custom" is exposed with the "detailed" tokens, not the "verbose"
ones: they are not double-quoted.

Because there's a risk that some people use yytname even without
"verbose", let's keep yytname (instead of yys_name) in "simple"
parse.error.

* src/output.c (prepare_symbol_names): Be ready to output symbol names
unquoted.
(prepare_symbol_names): Output both the old tname table, and the new
symbol_names one.
* data/skeletons/bison.m4: Accept 'detailed'.
* data/skeletons/yacc.c: When parse.error is 'detailed', don't emit
yytname and yytnamerr, just yysymbol_name with the table inside.
* tests/calc.at: Adjust.
This commit is contained in:
Akim Demaille
2020-01-16 18:31:26 +01:00
parent 8e6233353f
commit f443673450
4 changed files with 65 additions and 38 deletions

View File

@@ -616,10 +616,10 @@ mv at-expout expout]])
# the traditional one.
AT_ERROR_CUSTOM_IF([], [
AT_PERL_REQUIRE([[-pi -e 'use strict;
s{syntax error on token \["?(.*?)"?\] \(expected: (.*)\)}
s{syntax error on token \[(.*?)\] \(expected: (.*)\)}
{
my $unexp = $][1;
my @exps = $][2 =~ /\["?(.*?)"?\]/g;
my @exps = $][2 =~ /\[(.*?)\]/g;
($][#exps && $][#exps < 4)
? "syntax error, unexpected $unexp, expecting @{[join(\" or \", @exps)]}"
: "syntax error, unexpected $unexp";
@@ -694,15 +694,15 @@ _AT_CHECK_CALC([$1],
_AT_CHECK_CALC_ERROR([$1], [1], [1 2],
[[final: 0 0 1]],
[15],
[[1.3: syntax error on token ["number"] (expected: ['='] ['-'] ['+'] ['*'] ['/'] ['^'] ['\n'])]])
[[1.3: syntax error on token [number] (expected: ['='] ['-'] ['+'] ['*'] ['/'] ['^'] ['\n'])]])
_AT_CHECK_CALC_ERROR([$1], [1], [1//2],
[[final: 0 0 1]],
[20],
[[1.3: syntax error on token ['/'] (expected: ["number"] ['-'] ['('] ['!'])]])
[[1.3: syntax error on token ['/'] (expected: [number] ['-'] ['('] ['!'])]])
_AT_CHECK_CALC_ERROR([$1], [1], [error],
[[final: 0 0 1]],
[5],
[[1.1: syntax error on token [$undefined] (expected: ["number"] ['-'] ['\n'] ['('] ['!'])]])
[[1.1: syntax error on token [$undefined] (expected: [number] ['-'] ['\n'] ['('] ['!'])]])
_AT_CHECK_CALC_ERROR([$1], [1], [1 = 2 = 3],
[[final: 0 0 1]],
[30],
@@ -712,12 +712,12 @@ _AT_CHECK_CALC_ERROR([$1], [1],
+1],
[[final: 0 0 1]],
[20],
[[2.1: syntax error on token ['+'] (expected: ["end of input"] ["number"] ['-'] ['\n'] ['('] ['!'])]])
[[2.1: syntax error on token ['+'] (expected: [end of input] [number] ['-'] ['\n'] ['('] ['!'])]])
# Exercise error messages with EOF: work on an empty file.
_AT_CHECK_CALC_ERROR([$1], [1], [/dev/null],
[[final: 0 0 1]],
[4],
[[1.1: syntax error on token ["end of input"] (expected: ["number"] ['-'] ['\n'] ['('] ['!'])]])
[[1.1: syntax error on token [end of input] (expected: [number] ['-'] ['\n'] ['('] ['!'])]])
# Exercise the error token: without it, we die at the first error,
# hence be sure to
@@ -739,10 +739,10 @@ _AT_CHECK_CALC_ERROR([$1], [0],
[() + (1 + 1 + 1 +) + (* * *) + (1 * 2 * *) = 1],
[[final: 4444 0 4]],
[250],
[[1.2: syntax error on token [')'] (expected: ["number"] ['-'] ['('] ['!'])
1.18: syntax error on token [')'] (expected: ["number"] ['-'] ['('] ['!'])
1.23: syntax error on token ['*'] (expected: ["number"] ['-'] ['('] ['!'])
1.41: syntax error on token ['*'] (expected: ["number"] ['-'] ['('] ['!'])
[[1.2: syntax error on token [')'] (expected: [number] ['-'] ['('] ['!'])
1.18: syntax error on token [')'] (expected: [number] ['-'] ['('] ['!'])
1.23: syntax error on token ['*'] (expected: [number] ['-'] ['('] ['!'])
1.41: syntax error on token ['*'] (expected: [number] ['-'] ['('] ['!'])
calc: error: 4444 != 1]])
# The same, but this time exercising explicitly triggered syntax errors.
@@ -750,13 +750,13 @@ calc: error: 4444 != 1]])
_AT_CHECK_CALC_ERROR([$1], [0], [(!) + (1 2) = 1],
[[final: 2222 0 1]],
[102],
[[1.10: syntax error on token ["number"] (expected: ['='] ['-'] ['+'] ['*'] ['/'] ['^'] [')'])
[[1.10: syntax error on token [number] (expected: ['='] ['-'] ['+'] ['*'] ['/'] ['^'] [')'])
calc: error: 2222 != 1]])
_AT_CHECK_CALC_ERROR([$1], [0], [(- *) + (1 2) = 1],
[[final: 2222 0 2]],
[113],
[[1.4: syntax error on token ['*'] (expected: ["number"] ['-'] ['('] ['!'])
1.12: syntax error on token ["number"] (expected: ['='] ['-'] ['+'] ['*'] ['/'] ['^'] [')'])
[[1.4: syntax error on token ['*'] (expected: [number] ['-'] ['('] ['!'])
1.12: syntax error on token [number] (expected: ['='] ['-'] ['+'] ['*'] ['/'] ['^'] [')'])
calc: error: 2222 != 1]])
# Check that yyerrok works properly: second error is not reported,
@@ -764,9 +764,9 @@ calc: error: 2222 != 1]])
_AT_CHECK_CALC_ERROR([$1], [0], [(* *) + (*) + (*)],
[[final: 3333 0 3]],
[113],
[[1.2: syntax error on token ['*'] (expected: ["number"] ['-'] ['('] ['!'])
1.10: syntax error on token ['*'] (expected: ["number"] ['-'] ['('] ['!'])
1.16: syntax error on token ['*'] (expected: ["number"] ['-'] ['('] ['!'])]])
[[1.2: syntax error on token ['*'] (expected: [number] ['-'] ['('] ['!'])
1.10: syntax error on token ['*'] (expected: [number] ['-'] ['('] ['!'])
1.16: syntax error on token ['*'] (expected: [number] ['-'] ['('] ['!'])]])
AT_BISON_OPTION_POPDEFS