From ad172f6d46ad5b36fdc9cc34a2450c93f48b0f99 Mon Sep 17 00:00:00 2001 From: Nick Bowler Date: Sat, 8 Jul 2023 10:04:31 -0400 Subject: [PATCH] libcdecl: Use Bison's api.token.raw feature. By default, Bison numbers user-defined tokens starting from 257. If the scanner never returns plain characters (which is the case for libcdecl), this is inefficient. Recent versions of Bison provide the api.token.raw option to improve things. Let's turn it on, if configure detects that it is supported. This requires a very minor tweak to spec_string in order for the encoding of tokens into single-byte values to work regardless of which mode Bison is run in. --- configure.ac | 20 ++++++++++++++++++++ src/gen-specstr.awk | 6 ++++-- 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/configure.ac b/configure.ac index f1bd702..b963324 100644 --- a/configure.ac +++ b/configure.ac @@ -98,6 +98,26 @@ AS_IF([test x"$dx_cv_bison_warn_no_deprecated" = x"yes"], [AS_VAR_APPEND([BISON_COMPAT], ["${BISON_COMPAT:+ }-Wno-deprecated"])]) AC_SUBST([BISON_COMPAT]) +AS_IF([test x"$dx_cv_bison_define_cmdline" != x"yes"], + [dx_cv_bison_api_token_raw=no]) +AC_CACHE_CHECK([whether $BISON supports api.token.raw], + [dx_cv_bison_api_token_raw], [dx_cv_bison_api_token_raw=no +cat >conftest.y <<'EOF' +%token T_TEST +%{ +int yylex(void) { return 0; } +void yyerror(const char *msg) { } +%} +%% +input: +EOF +AS_IF([$BISON --define api.token.raw conftest.y >&AS_MESSAGE_LOG_FD 2>&1], +[AC_COMPUTE_INT([testval], [T_TEST], [#include "conftest.tab.c" +]) +AS_IF([test "$testval" -lt 256], [dx_cv_bison_api_token_raw=yes])])]) +AS_IF([test x"$dx_cv_bison_api_token_raw" = x"yes"], + [AS_VAR_APPEND([BISON_COMPAT], [" --define api.token.raw"])]) + AH_TOP([#include ]) AH_BOTTOM([#include ]) diff --git a/src/gen-specstr.awk b/src/gen-specstr.awk index c07856e..6831667 100755 --- a/src/gen-specstr.awk +++ b/src/gen-specstr.awk @@ -79,7 +79,7 @@ END { if (specs[i] == "IDENT") s = "0"; else - s = "T_" substr(specs[i] " ", 1, maxwidth) " - 256"; + s = "T_" substr(specs[i] " ", 1, maxwidth) " & 0xff"; offset_table = offset_table s suffix; } @@ -93,6 +93,8 @@ END { print "\tassert(x < sizeof idx);"; print "\tif (!(x = idx[x]))"; print "\t\treturn \"\";"; - print "\treturn cdecl__token_name(x + 256);"; + print "\tif (T_" specs[0] " >= 256)"; + print "\t\tx += 256;"; + print "\treturn cdecl__token_name(x);"; print "}"; } -- 2.43.2