Wallogit.com
2017 © Pedro Peláez
Lime parser generator
Interpreter pattern got you down? Time to use a real parser? Welcome to Lime., (*1)
Use composer to install Lime., (*2)
composer require gene-sis/lime, (*3)
Build lime_scan_tokens for your development OS., (*4)
For Windows run
flex -t vendor\gene-sis\lime\scanner\lime_scan_tokens.l > vendor\gene-sis\lime\scanner\lime_scan_tokens.c
and
gcc vendor\gene-sis\lime\scanner\lime_scan_tokens.c -o vendor\gene-sis\lime\scanner\lime_scan_tokens.exe
from the command line., (*5)
Write a grammar file, (*6)
Lime uses slightly modified and tweaked Backus-Naur forms. You can look at the .lime examples in the folder /vendor/gene-sis/lime/examples to understand the grammar., (*7)
You can refer to your components by numbers the way BISON demands
exp = exp '+' exp {
$$ = $1 + $3;
);
or assign symbolic names (similar to C-based "Lemon" parser from which
Lime derives its name)
exp = exp/a '+' exp/b {
$$ = $a + $b;
);
Oh, and one other thing: symbols are terminal if the scanner feeds them
to the parser. They are non-terminal if they appear on the left side of
a production rule. Lime names semantic categories using strings instead
of the numbers that BISON-based parsers use, so you don't have to declare
any list of terminal symbols anywhere., (*8)
Defined pragmas, (*9)
%namespace 'YourProject\Extensions\Lime'
Build your parser, (*10)
php /vendor/gene-sis/lime/lime.php path/to/your/grammar/file.lime > MyParser.php, (*11)
Integrate your parser into your project, (*12)
// below the namespace
use YourProject\Extensions\Lime\MyParser;
use Genesis\Lime\ParseEngine;
use Genesis\Lime\ParseError;
// create the parser instance
$parser = new ParseEngine( new MyParser() );
// run the parser
try {
// reset the parser
$parser->reset();
// tokenize your input with a suitable function/method and feed the
// tokens to the parser
foreach( tokenize( $input ) as $token ) {
$parser->eat( $token['type'], $token['value'] );
}
// get the result
$result = $parser->eat_eof();
} catch ( ParseError $e ) {
// handle parse errors
$error = $e->getMessage();
}