Commit f0ac5e4c authored by Igor Dejanovic's avatar Igor Dejanovic

README update

parent f22474b1
...@@ -41,51 +41,51 @@ Quick start ...@@ -41,51 +41,51 @@ Quick start
Write a grammar. There are several ways to do that: Write a grammar. There are several ways to do that:
- The canonical grammar format uses Python statements and expressions. - The canonical grammar format uses Python statements and expressions.
Each rule is specified as Python function which should return a data Each rule is specified as Python function which should return a data
structure that defines the rule. For example a grammar for simple structure that defines the rule. For example a grammar for simple
calculator can be written as: calculator can be written as:
.. code:: python .. code:: python
from arpeggio import Optional, ZeroOrMore, OneOrMore, EOF from arpeggio import Optional, ZeroOrMore, OneOrMore, EOF
from arpeggio import RegExMatch as _ from arpeggio import RegExMatch as _
def number(): return _(r'\d*\.\d*|\d+') def number(): return _(r'\d*\.\d*|\d+')
def factor(): return Optional(["+","-"]), def factor(): return Optional(["+","-"]),
[number, ("(", expression, ")")] [number, ("(", expression, ")")]
def term(): return factor, ZeroOrMore(["*","/"], factor) def term(): return factor, ZeroOrMore(["*","/"], factor)
def expression(): return term, ZeroOrMore(["+", "-"], term) def expression(): return term, ZeroOrMore(["+", "-"], term)
def calc(): return OneOrMore(expression), EOF def calc(): return OneOrMore(expression), EOF
The python lists in the data structure represent ordered choices while the tuples represent sequences from the PEG. The python lists in the data structure represent ordered choices while the tuples represent sequences from the PEG.
For terminal matches use plain strings or regular expressions. For terminal matches use plain strings or regular expressions.
- The same grammar could also be written using traditional textual PEG syntax like this: - The same grammar could also be written using traditional textual PEG syntax like this:
:: ::
number <- r'\d*\.\d*|\d+'; // this is a comment number <- r'\d*\.\d*|\d+'; // this is a comment
factor <- ("+" / "-")? factor <- ("+" / "-")?
(number / "(" expression ")"); (number / "(" expression ")");
term <- factor (( "*" / "/") factor)*; term <- factor (( "*" / "/") factor)*;
expression <- term (("+" / "-") term)*; expression <- term (("+" / "-") term)*;
calc <- expression+ EOF; calc <- expression+ EOF;
- Or similar syntax but a little bit more readable like this: - Or similar syntax but a little bit more readable like this:
:: ::
number = r'\d*\.\d*|\d+' # this is a comment number = r'\d*\.\d*|\d+' # this is a comment
factor = ("+" / "-")? factor = ("+" / "-")?
(number / "(" expression ")") (number / "(" expression ")")
term = factor (( "*" / "/") factor)* term = factor (( "*" / "/") factor)*
expression = term (("+" / "-") term)* expression = term (("+" / "-") term)*
calc = expression+ EOF calc = expression+ EOF
The second and third options are implemented using canonical first form. The second and third options are implemented using canonical first form.
Feel free to implement your own grammar syntax if you don't like these Feel free to implement your own grammar syntax if you don't like these
(see modules :code:`arpeggio.peg` and :code:`arpeggio.cleanpeg`). (see modules :code:`arpeggio.peg` and :code:`arpeggio.cleanpeg`).
Instantiate a parser. Parser works as grammar interpreter. There is no code generation. Instantiate a parser. Parser works as grammar interpreter. There is no code generation.
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment