From 8976e0f567a3dd7b5c4370492f111e06869a4d74 Mon Sep 17 00:00:00 2001 From: Akim Demaille Date: Sun, 1 Dec 2019 09:45:16 +0100 Subject: api.token.raw: check it against api.token.constructor * tests/scanner.at: here. --- tests/scanner.at | 59 ++++++++++++++++++++++++++++++++++++++++++++++---------- 1 file 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 /* 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 NUM "number" +%nterm exp +]], [[ %union { int val; } %token NUM "number" +%nterm exp +]])[ + %token PLUS "+" MINUS "-" @@ -158,7 +196,7 @@ AT_DATA_GRAMMAR([[input.y]], SLASH "/" LPAR "(" RPAR ")" -%nterm 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]) -- cgit v1.2.1