25 lines
1.4 KiB
Text
25 lines
1.4 KiB
Text
|
Grako (for grammar compiler) is a tool that takes grammars in a variation of
|
||
|
EBNF as input, and outputs memoizing (Packrat) PEG parsers in Python.
|
||
|
|
||
|
Grako can also compile a grammar stored in a string into a Grammar object that
|
||
|
can be used to parse any given input, much like the re module does with
|
||
|
regular expressions.
|
||
|
|
||
|
Grako is different from other PEG parser generators:
|
||
|
* Generated parsers use Python's very efficient exception-handling system to
|
||
|
backtrack. Grako generated parsers simply assert what must be parsed. There
|
||
|
are no complicated if-then-else sequences for decision making or
|
||
|
backtracking. Memoization allows going over the same input sequence several
|
||
|
times in linear time.
|
||
|
* Positive and negative lookaheads, and the cut element (with its cleaning of
|
||
|
the memoization cache) allow for additional, hand-crafted optimizations at
|
||
|
the grammar level.
|
||
|
* Delegation to Python's re module for lexemes allows for (Perl-like) powerful
|
||
|
and efficient lexical analysis.
|
||
|
* The use of Python's context managers considerably reduces the size of the
|
||
|
generated parsers for code clarity, and enhanced CPU-cache hits.
|
||
|
* Include files, rule inheritance, and rule inclusion give Grako grammars
|
||
|
considerable expressive power.
|
||
|
* Automatic generation of Abstract Syntax Trees and Object Models, along with
|
||
|
Model Walkers and Code Generators make analysis and translation approachable.
|