[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
api.token.raw: check it against api.token.constructor
From: |
Akim Demaille |
Subject: |
api.token.raw: check it against api.token.constructor |
Date: |
Sat, 7 Dec 2019 09:35:20 +0100 |
At some point I saw that api.token.contructor seemed to depend on the converse
of yytranslate, i.e., the table named toknum. But toknum was incorrect when
api.token.raw is enabled, so I wrote the following test case to break it.
Alas (?) it broke nothing, and I had to realize that toknum was actually used
in dead code. I eliminated it in "c++: get rid of symbol_type::token ()"
(8c87a62308a2b60ad,
https://lists.gnu.org/archive/html/bison-patches/2019-12/msg00004.html), but
let's keep the test case anyway.
commit 8976e0f567a3dd7b5c4370492f111e06869a4d74
Author: Akim Demaille <address@hidden>
Date: Sun Dec 1 09:45:16 2019 +0100
api.token.raw: check it against api.token.constructor
* tests/scanner.at: here.
diff --git a/tests/scanner.at b/tests/scanner.at
index 39abf693..c03dbbbd 100644
--- a/tests/scanner.at
+++ b/tests/scanner.at
@@ -43,20 +43,51 @@ AT_YYLEX_PROTOTYPE[
case '8':
case '9':
]AT_VAL[.val = c - '0';
- return ]AT_CXX_IF([yy::parser::token::])[NUM;
- case '+': return ]AT_CXX_IF([yy::parser::token::])[PLUS;
- case '-': return ]AT_CXX_IF([yy::parser::token::])[MINUS;
- case '*': return ]AT_CXX_IF([yy::parser::token::])[STAR;
- case '/': return ]AT_CXX_IF([yy::parser::token::])[SLASH;
- case '(': return ]AT_CXX_IF([yy::parser::token::])[LPAR;
- case ')': return ]AT_CXX_IF([yy::parser::token::])[RPAR;
- case 0: return 0;
+ return NUM;
+ case '+': return PLUS;
+ case '-': return MINUS;
+ case '*': return STAR;
+ case '/': return SLASH;
+ case '(': return LPAR;
+ case ')': return RPAR;
+ case 0: return 0;
}
abort ();
}
]])
-m4_copy([AT_RAW_YYLEX(c)], [AT_RAW_YYLEX(c++)])
+m4_define([AT_RAW_YYLEX(c++)],
+[#include <stdlib.h> /* abort */
+AT_YYLEX_PROTOTYPE[
+{
+ static const char* input = "0-(1+2)*3/9";
+ int c = *input++;
+ switch (c)
+ {
+ case '0':
+ case '1':
+ case '2':
+ case '3':
+ case '4':
+ case '5':
+ case '6':
+ case '7':
+ case '8':
+ case '9':]AT_TOKEN_CTOR_IF([[
+ return yy::parser::make_NUM (c - '0');]], [[
+ ]AT_VAL[.val = c - '0';
+ return yy::parser::token::NUM;]])[
+ case '+': return yy::parser::]AT_TOKEN_CTOR_IF([make_PLUS ()],
[token::PLUS])[;
+ case '-': return yy::parser::]AT_TOKEN_CTOR_IF([make_MINUS ()],
[token::MINUS])[;
+ case '*': return yy::parser::]AT_TOKEN_CTOR_IF([make_STAR ()],
[token::STAR])[;
+ case '/': return yy::parser::]AT_TOKEN_CTOR_IF([make_SLASH ()],
[token::SLASH])[;
+ case '(': return yy::parser::]AT_TOKEN_CTOR_IF([make_LPAR ()],
[token::LPAR])[;
+ case ')': return yy::parser::]AT_TOKEN_CTOR_IF([make_RPAR ()],
[token::RPAR])[;
+ case 0: return yy::parser::]AT_TOKEN_CTOR_IF([make_END ()],
[token::END])[;
+ }
+ abort ();
+}
+]])
m4_define([AT_RAW_YYLEX(d)],
[[import std.range.primitives;
@@ -147,10 +178,17 @@ AT_DATA_GRAMMAR([[input.y]],
]AT_YYLEX_DECLARE[
}]])[
+]AT_VARIANT_IF([[
+%token <int> NUM "number"
+%nterm <int> exp
+]], [[
%union {
int val;
}
%token <val> NUM "number"
+%nterm <val> exp
+]])[
+
%token
PLUS "+"
MINUS "-"
@@ -158,7 +196,7 @@ AT_DATA_GRAMMAR([[input.y]],
SLASH "/"
LPAR "("
RPAR ")"
-%nterm <val> exp
+ END 0
%left "+" "-"
%left "*" "/"
@@ -206,6 +244,7 @@ m4_foreach([b4_skel], [[yacc.c], [glr.c], [lalr1.cc],
[glr.cc], [lalr1.d]],
[AT_TEST([%skeleton "]b4_skel["])
AT_TEST([%skeleton "]b4_skel[" %define api.token.raw])])
+AT_TEST([%skeleton "lalr1.cc" %define api.token.raw %define api.value.type
variant %define api.token.constructor])])
m4_popdef([AT_MAIN_DEFINE(d)])
m4_popdef([AT_TEST])
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- api.token.raw: check it against api.token.constructor,
Akim Demaille <=