summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAkim Demaille <akim.demaille@gmail.com>2019-12-01 09:45:16 +0100
committerAkim Demaille <akim.demaille@gmail.com>2019-12-07 08:57:14 +0100
commit8976e0f567a3dd7b5c4370492f111e06869a4d74 (patch)
treec8ad5e4e13f0b89803d4c70b640b3e34e75b6b0f
parent6dca1eb95006c3c38fc62aaed3a5ca88369b7c0b (diff)
downloadbison-8976e0f567a3dd7b5c4370492f111e06869a4d74.tar.gz
api.token.raw: check it against api.token.constructor
* tests/scanner.at: here.
-rw-r--r--tests/scanner.at59
1 files changed, 49 insertions, 10 deletions
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])