+AT_BISON_CHECK([-o input.c input.y])
+
+AT_CLEANUP
+
+
+## -------------- ##
+## Symbol names. ##
+## -------------- ##
+
+AT_SETUP([Symbols])
+
+AT_DATA_GRAMMAR([input.y],
+[[%token WITH-DASH
+%token WITHOUT_DASH "WITHOUT-DASH"
+%token WITH.PERIOD
+%token WITHOUT_PERIOD "WITHOUT.PERIOD"
+%code {
+ void yyerror (char const *);
+ int yylex (void);
+}
+%%
+start: with-dash without_dash with.period without_period;
+with-dash: WITH-DASH;
+without_dash: "WITHOUT-DASH";
+with.period: WITH.PERIOD;
+without_period: "WITHOUT.PERIOD";
+%%
+]])
+
+# POSIX Yacc accept periods, but not dashes.
+AT_BISON_CHECK([--yacc input.y], [1], [],
+[[input.y:9.8-16: POSIX Yacc forbids dashes in symbol names: WITH-DASH
+input.y:18.8-16: POSIX Yacc forbids dashes in symbol names: with-dash
+]])
+
+# So warn about them.
+AT_BISON_CHECK([-Wyacc input.y], [], [],
+[[input.y:9.8-16: warning: POSIX Yacc forbids dashes in symbol names: WITH-DASH
+input.y:18.8-16: warning: POSIX Yacc forbids dashes in symbol names: with-dash
+]])
+
+# Dashes are fine for GNU Bison.
+AT_BISON_CHECK([-o input.c input.y])
+
+# Make sure we don't export silly token identifiers with periods or dashes.
+AT_COMPILE([input.o], [-c input.c])
+
+
+# Periods and dashes are genuine letters, they can start identifiers.
+# Digits cannot.
+AT_DATA_GRAMMAR([input.y],
+[[%token .GOOD
+ -GOOD
+ 1NV4L1D
+%%
+start: .GOOD -GOOD
+]])
+AT_BISON_CHECK([-o input.c input.y], [1], [],
+[[input.y:11.10-16: invalid identifier: `1NV4L1D'
+]])
+
+AT_CLEANUP
+
+
+## ----------------- ##
+## Numbered tokens. ##
+## ----------------- ##
+
+AT_SETUP([Numbered tokens])
+
+AT_DATA_GRAMMAR([1.y],
+[[%token DECIMAL 11259375
+ HEXADECIMAL 0xabcdef
+%%
+start: DECIMAL;
+]])
+
+AT_BISON_CHECK([1.y], [1], [],
+[[1.y:10.10-20: user token number 11259375 redeclaration for HEXADECIMAL
+1.y:9.8-14: previous declaration for DECIMAL
+]])
+
+
+AT_DATA_GRAMMAR([2.y],
+[[%token HEXADECIMAL 0xabcdef
+ DECIMAL 11259375
+%%
+start: HEXADECIMAL;
+]])
+
+AT_BISON_CHECK([2.y], [1], [],
+[[2.y:10.10-16: user token number 11259375 redeclaration for DECIMAL
+2.y:9.8-18: previous declaration for HEXADECIMAL
+]])
+
+
+AT_DATA_GRAMMAR([3.y],
+[[%token TOO_LARGE_DEC 999999999999999999999
+ TOO_LARGE_HEX 0xFFFFFFFFFFFFFFFFFFF
+%%
+start: TOO_LARGE_DEC TOO_LARGE_HEX
+%%
+]])
+
+AT_BISON_CHECK([3.y], [1], [],
+[[3.y:9.22-42: integer out of range: `999999999999999999999'
+3.y:10.24-44: integer out of range: `0xFFFFFFFFFFFFFFFFFFF'
+]])