Asked  7 Months ago    Answers:  5   Viewed   43 times

Is there an implementation of Lex and Yacc in PHP?

If not, can anyone suggest a lexical analyser and parser generator (ie, anything like Lex and Yacc) that will create PHP code. I'm not too worried about the performance of the resulting parser.

I am sick of using regex to parse things that really shouldn't be parsed with regex...

 Answers

92

There's JLexPHP: https://github.com/wez/JLexPHP/blob/master/jlex.php

I've not used it, but there's this: http://pear.php.net/package/PHP_ParserGenerator , which creates a PHP Parser from a Lemon grammar. The project seems to be inactive though.

I also found this project: http://code.google.com/p/antlrphpruntime/ , which uses Antlr. Again inactive though.

Wednesday, March 31, 2021
 
skrilled
answered 7 Months ago
52

I think you can to this by using the --name-prefix option to Bison, and the --prefix option to Flex.

In both cases they allow you to replace the default "yy" prefix used on the functions generated with a prefix of your own choice.

Saturday, July 31, 2021
 
bimal
answered 3 Months ago
80

The version of yacc you are using is producing C code which is invalid for C99.

The code it produces does not include declarations for the functions yylex or yyerror prior to calling them. This is producing the warnings. In the case of yyerror, it is also resulting in an implicit declaration which does not match the later actual definition.

You can get around it by including the following at the top of the .y file:

%{
int yylex();
void yyerror(const char *s);
%}

Or, you can switch to a more modern yacc compiler.

See also this: Simple yacc grammars give an error

Thursday, August 12, 2021
 
binoculars
answered 3 Months ago
85

There are some differences between Lex and Flex, but you have to be abusing Lex to run into the problems with Flex. (I have a program which abuses Lex and doesn't work under Flex, therefore.) This is primarily in the area of input lookahead; in Lex, you can provide your own input code and modify the character stream; Flex won't let you do that.

Yacc and Bison are pretty closely compatible, though Bison has some extra tricks it can do.

You probably can't find legitimate copies of (the original, AT&T versions of) Lex and Yacc to install on Ubuntu. I wouldn't necessarily say it is impossible, but I'm not aware of such. Flex and Bison are readily available and are equivalent for most purposes. You may also find various alternative and approximately equivalent programs from the BSD world.

Lex and Yacc are maintained by the Unix SVRx licencees - companies such as IBM (AIX), HP (HP-UX) and Sun (Solaris) have modified versions of Lex and Yacc at their command. MKS also provides MKS Lex and MKS Yacc; however, the Yacc at least has some non-standard extensions.

Flex and Bison are free. (AT&T) Lex and Yacc are not.

Friday, September 3, 2021
 
BradM
answered 2 Months ago
42

Note that Bison provides the '-p zz' option to prefix symbols with 'zz' instead of 'yy'.

Similarly, Flex provides the '-P zz' option to prefix symbols with 'zz' instead of 'yy'. It uses '-p' for performance reporting. 'Tis a pity they are not consistent with each other.

Wednesday, October 13, 2021
 
talkhabi
answered 2 Weeks ago
Only authorized users can answer the question. Please sign in first, or register a free account.
Not the answer you're looking for? Browse other questions tagged :
 
Share