SYNOPSIS
typedef union or int YYSTYPE; YYTRACE YYDEBUG YYTRACE YYSYNC YYERROR YYACCEPT YYABORT YYRETURN(value) YACC_WINDOWS #if YYDEBUG typedef struct { char * name; short type, type; } yyNamedType; typedef struct { char * name; short type; } yyTypedRules; char * yysvar[]; yyNamedType yyTokenTypes[]; yyTypedRules yyRules[]; long yyStates[]; #endif class yy_parse { protected: short yystate; short * stateStack, * yyps; YYSTYPE * valueStack, * yypv; YYSTYPE yylval; int yychar; #ifdef YACC_WINDOWS int win_yyparse(yy_scan *); #endif ... #if YYDEBUG || YYTRACE tracing functions, see Tracing Functions #endif public: yy_scan * scan; int yydebug; int yyntoken, yynvar, yynstate, yynrule; yy_parse(int sz= 150); yy_parse(int sz, short *states, YYSTYPE *vals); ~yy_parse(); int yyparse(yy_scan *); void yyreset(void); void setdebug(int); void yyerrok(void); void yyclearin(void); int YYRECOVERING(void); } ; extern int yy_scan::yylex(void); extern int yy_scan::yyerror(char *fmt, ...); extern YYSTYPE yylval; extern HANDLE hInst;
DESCRIPTION
Typedefs
- YYSTYPE
-
is either a typedef or an int, depending on whether your grammar defines a %union or not. YACC writes the appropriate definition into a header definition file (by default, ytab.hpp).
Macros
- YYTRACE
-
is a preprocessor symbol that can be defined when compiling the yacc generated code with user-supplied tracing code. If defined, the symbol YYDEBUG is also defined, causing YACC debugging tables and the yydebug variable to be declared. As well, unlike YYDEBUG, when this symbol is defined no trace functions are defined; these must be provided by the user.
- YYDEBUG
-
is a preprocessor symbol that can be defined when compiling the yacc generated code. If defined, additional YACC debugging tables are declared, and a number of virtual functions for printing YACC traces are defined.
- YYSYNC
-
is a preprocessing symbol that can be defined to cause
yyparse() to fetch any lookahead before any user action is executed. It is usually not defined. - YYERROR
-
is a macro that can be coded in a YACC action to raise a parse error.
- YYACCEPT
-
is a macro that can be coded in an action to cause
yyparse() to return as though it had succeeded parsing. - YYABORT
-
is a macro that can be coded in an action to cause
yyparse() to return as though the parse had failed. - YYRETURN(value)
-
is a macro that can be coded in an action to cause
yyparse() to return the indicated value. - YACC_WINDOWS
-
is defined automatically whe creating Windows resources to enable the automatic loading and unloading of the resource based parser tables. This flag should not be enabled manually.
Class yy_parse
The following objects are part of the class yy_parse, defined in the header file produced by yacc.
- Note:
-
There are additional protected members not documented here.
- yystate
-
has the current internal state number of the YACC generated parser. If YYDEBUG is defined, the external state number is available in yysmap[yystate].
- valueStack
-
is a pointer to an array of YYSTYPE used to save values. valueStack is a protected member of yy_parse, and is initialized in the constructor for yy_parse; see Constructors.
- stateStack
-
is a pointer to an array of shorts used to save states by
yyparse() . stateStack is a protected member of yy_parse; like valueStack, it is initialized in the yy_parse constructor. - yyps, yypv
-
are protected pointers to the tops of the state and value stacks, respectively.
- yylval
-
is declared as a member variable of type YYSTYPE. It is used to hold the current value of the global ::yylval, which is filled in by
yylex() . - yychar
-
is an int variable holding the latest token read from
yylex() , or the value -1 to indicate that lookahead has been cleared. - scan
-
is a pointer to an object of type yy_scan , which should contain, at a minimum, member functions
yylex() andyyerror() . See the mks_lexplus reference page for the definitions required. The parser generated by YACC uses a LEX-generated scanner to read input tokens. If you are not using LEX, you can define a dummy yy_scan as follows:class yy_scan { public: int yylex(); void yyerror(char *, ...); } ; int yy_scan::yylex() { /* token scanner */ } void yy_scan::yyerror(char * msg, ...) { /* print error message */ }
- yydebug
-
is an int variable, initially set to 0. If the YACC generated code is compiled with YYDEBUG defined, then setting this variable to 1 causes
yyparse() to print a trace of the parsing activity. This is useful for debugging a new grammar. - yyntoken, yynvar, yynstate, yynrule
-
are constants containing the sizes of various debugging tables.
Constructors
When a member of class yy_parse is defined, one of two C++ constructors can be used. The default constructor takes an optional integer argument, which defaults to 150, and allocates tables of that length for valueStack and stateStack, using the C++ new operator. This constructor also sets a flag so that the destructor for yy_scan can delete that space.
The other constructor is defined as:
yy_parse(int sz, short* states, YYSTYPE* vals);
This constructor can be used if you want to allocate the stateStack and valueStack tables yourself, for example:
short states[50]; YYSTYPE values[50]; yy_parse parse(50, states, values); // use local tables
Your tables should all be of the length specified by sz.
- Note:
-
The destructor for yy_parse does not attempt to delete your tables if you use this constructor.
Member Functions
- int win_yyparse(yy_scan *)
-
When generating a parser compatible in a Windows environment, yacc renames the standard parser function
win_yyparse() as a protected member function, and creates another member functionyyparse() as a wrapper, responsible for the loading and unloading of resource based tables. This function callswin_yyparse() if tables were loaded without error. Thus, the Windows support is in effect transparent to the user ofyyparse() . See the description ofyyparse() for more details. Ensure that the global variable hInst is set with the window handle of the application prior to callingyyparse() when developing a Windows application using lex and yacc. - int yyparse(yy_scan *)
-
the parser that yacc generates. It takes a single argument, which is a pointer to an object of type yy_scan. If a user action does a return from
yyparse() , it can be recalled to continue parsing from its current position. To restart a parse, callyyreset() first. - void yyreset(void)
-
is a function that can be called to reset
yy_parse() , so that the next call toyyparse() restarts a parse. - void setdebug(int)
-
is a function taking a value that is assigned to yydebug. You can call
setdebug() to start or stop debug tracing, assuming you compiled the YACC generated code with YYDEBUG defined. - void yyerrok(void)
-
is a function that can be coded in an action to clear the yacc error condition.
- void yyclearin(void)
-
is a function that can be coded in an action to clear any lookahead tokens.
- int YYRECOVERING(void)
-
is a function that returns 1 if
yyparse() is recovering from a parse error, and 0 otherwise.
Externals
The following are external to YACC, and must be defined elsewhere.
- int yy_scan::yylex(void)
-
is the lexical scanner that
yyparse() calls when a new token is needed. It should return a token value, and possibly assign a value to yylval. - void yy_scan::yyerrror(char *,...)
-
is used by YACC to print diagnostics. If you use LEX, the default definition of
yyerror() simply prints its arguments, usingvfprintf() , with output to the error stream stderr. - yylval
-
is the external variable that contains the token value, assigned in
yylex() . It is of the type YYSTYPE, which is an int if your grammar does not have a %union, and a union typedef otherwise. - hInst
-
is an externally declared variable that holds the window handle of the application. It is used to access the resources which contain the parser tables when an application is developed for Microsoft Windows.
YACC Tracing
If YYDEBUG is defined as a non-zero value,
a number of tracing variables and functions are provided.
You can define YYDEBUG
by using the
Tracing Variables
- char * yysvar[]
-
is a table of the YACC variables (non-terminals) in the grammar.
- yyNamedType yyTokenTypes[]
-
is a table containing the YACC token names, and their types and token values.
- yyTypedRules yyRules[]
-
is a table of all the rules in the grammar, and their declared type. The rules are encoded to save space; see
yyExpandName() . - long yyStates[]
-
is a table of offsets into the statesfile produced by YACC with the
-s or-S states options. This file contains encoded state strings for the grammar; seeyyExpandName() . - short yyrmap[]
-
contains the mapping from internal to external reduction numbers. YACC encodes numbers to save table space.
- short yysmap[]
-
is the counterpart to yyrmap for state numbers.
Information Functions
- int yyGetType(int token)
-
returns the type of a token, using the yyTokenTypes table.
- char * yyptok(int token)
-
returns a printable representation of a given token, using the yyTokenTypes table.
- int yyExpandName(int n, int isrule, char* s, int len)
-
looks up a state or rule number, and fills in the given string s with a printable representation of this state or rule. If isrule is set, the table yyRules is used to obtain the rule description. Otherwise, the table yyStates is used to determine the index fo the state description file states.out, which YACC generates with the
-s option. This file contains encoded state information.In either case,
yyExpandName() decodes the description and fills in the given string. If the string is too short, 0 is returned and the characters "..." are appended to the string; otherwise, 1 is returned.
Tracing Functions
- void yyShowState(void)
-
prints the current state, lookahead, and number of pushed states. The current state is in yystate, and the lookahead is in yychar. If done is set when YACC resumes, the parse is terminated.
- void yyShowShift(void)
-
prints the transition via a Shift to a new state. The new state is in yystate. If done is set when YACC resumes, the parse is terminated.
- void yyShowRedcue(void)
-
prints the rule number that caused a reduction, available in rule, and the number of states to be popped, from npop. If done is set when YACC resumes, the parse is terminated.
- void yyShowGoto(void)
-
prints the transition via Goto to a new state, available in yystate. If done is set when YACC resumes, the parse is terminated.
- void yyShowErrRecovery(void)
-
prints the state YACC discards on error recovery, available in *yyps, and the new uncovered state, in *(yyps-1). If done is set when YACC resumes, the parse is terminated.
- void yyShowErrDiscard(void)
-
prints the value of the token, in yyvar, that is being discarded by the error recovery mechanism. If done is set when YACC resumes, the parse is terminated.
- void yyShowRead(void)
-
prints the token value in yyvar returned from
yylex() .
FILES
- ROOTDIR/etc/yyparse.cpp
-
prototype YACC parser for C++
- ROOTDIR/libmks/*.cpp
-
source files for YACC libraries
- ROOTDIR/libmks/*.lib
-
Microsoft Visual C++ library files
AVAILABILITY
PTC MKS Toolkit for Developers
PTC MKS Toolkit for Interoperability
SEE ALSO
- Miscellaneous:
- mks_lexplus
PTC MKS Toolkit 10.4 Documentation Build 39.