Next: Precedence Decl, Previous: Require Decl, Up: Declarations [Contents][Index]
The basic way to declare a token type name (terminal symbol) is as follows:
%token name
Bison will convert this into a #define
directive in
the parser, so that the function yylex
(if it is in this file)
can use the name name to stand for this token type’s code.
Alternatively, you can use %left
, %right
,
%precedence
, or
%nonassoc
instead of %token
, if you wish to specify
associativity and precedence. See Operator
Precedence.
You can explicitly specify the numeric code for a token type by appending a nonnegative decimal or hexadecimal integer value in the field immediately following the token name:
%token NUM 300 %token XNUM 0x12d // a GNU extension
It is generally best, however, to let Bison choose the numeric codes for all token types. Bison will automatically select codes that don’t conflict with each other or with normal characters.
In the event that the stack type is a union, you must augment the
%token
or other token declaration to include the data type
alternative delimited by angle-brackets (see More
Than One Value Type).
For example:
%union { /* define stack type */ double val; symrec *tptr; } %token <val> NUM /* define token NUM and its type */
You can associate a literal string token with a token type name by
writing the literal string at the end of a %token
declaration which declares the name. For example:
%token arrow "=>"
For example, a grammar for the C language might specify these names with equivalent literal string tokens:
%token <operator> OR "||" %token <operator> LE 134 "<=" %left OR "<="
Once you equate the literal string and the token name, you can use them
interchangeably in further declarations or the grammar rules. The
yylex
function can use the token name or the literal string to
obtain the token type code number (see Calling Convention).
Syntax error messages passed to yyerror
from the parser will reference
the literal string instead of the token name.
The token numbered as 0 corresponds to end of file; the following line allows for nicer error messages referring to “end of file” instead of “$end”:
%token END 0 "end of file"
Next: Precedence Decl, Previous: Require Decl, Up: Declarations [Contents][Index]