bison-patches
[Top][All Lists]
Advanced

[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])




reply via email to

[Prev in Thread] Current Thread [Next in Thread]