|o||The parser wants to receive integer token types as defined in y.tab.ph instead of the symbolic types that Parse::Lex returns.|
|o||The parser wants its tokens as two components (type and value), whereas Parse::Lex returns one object with these two components. Furthermore, a procedural parser wants the value stored in a variable $yylval.|
|o||The parser wants to receive the tokens by calling a yylex <B>functionB>, not an object <B>methodB>. Thus we have to give the parser a curried form of the lexer function, where the self argument is fixed.|
Yacc (and Bison) traditionally generate C or C++ parsers. Fortunately, Berkeley yacc has been modified to generate Perl, see
Byacc with the -P option generates procedural perl code that is compatible with both perl4 and perl5. (However you cannot use <B>Parse::YYLexB> with perl4.) Use this variant for quick hacks, as it is more convenient than the one below. In this case Parse::YYLex-create> instantiates a lexer and exports a &yylex function (the lexer) and a $yylval variable (the token value) to its callers namespace (which should be the namespace of the parser).
If you need to call any object methods of the created lexer (see Parse::Lex for documentation), use the $Parse::YYLex::lex variable.
Another byacc modification (I call it byacc5) generates object-oriented Perl5 code:
Use this variant if you need more than one parser, you need flexibility, or you simply like OO. In this case you need to use new, and pass the return value of getyylex (a reference to the curried lexing function) to the parser. The lexing function returns a two-element array, the token type and value.
Yacc parsers insist on using numeric token types, and define these in a file customarily named y.tab.ph. That is where <B>Parse::YYLexB> will look by default, and the file has to be in the @INC path (which includes the current directory).
You can specify a different token table before calling new or create:
Parse::YYLex is based on Parse::Lex which requires perl 5.004 and will not work with earlier versions. A slightly different version, Parse::CLex, works with earlier perl versions. It would be easy to allow a choice between Parse::Lex and Parse::CLex, but the latter has some limitations, and presently seems to have some bugs.
Vladimir Alexiev <email@example.com>
|perl v5.20.3||PARSE::YYLEX (3)||2011-12-31|