More ways of writing
Sometimes prettier
This commit is contained in:
parent
3012df4ac6
commit
0354fbf4a4
2 changed files with 26 additions and 15 deletions
30
grammar.py
30
grammar.py
|
|
@ -1,5 +1,5 @@
|
|||
# This is an example grammar.
|
||||
from parser import Assoc, Grammar, rule, seq, Rule, Terminal, Re, Highlight, mark, opt
|
||||
from parser import alt, Assoc, Grammar, rule, seq, Rule, Terminal, Re, Highlight, mark, opt
|
||||
|
||||
|
||||
class FineGrammar(Grammar):
|
||||
|
|
@ -198,20 +198,20 @@ class FineGrammar(Grammar):
|
|||
|
||||
@rule("BinaryExpression")
|
||||
def binary_expression(self) -> Rule:
|
||||
return (
|
||||
seq(self.expression, self.EQUAL, self.expression)
|
||||
| seq(self.expression, self.OR, self.expression)
|
||||
| seq(self.expression, self.AND, self.expression)
|
||||
| seq(self.expression, self.EQUALEQUAL, self.expression)
|
||||
| seq(self.expression, self.BANGEQUAL, self.expression)
|
||||
| seq(self.expression, self.LESS, self.expression)
|
||||
| seq(self.expression, self.LESSEQUAL, self.expression)
|
||||
| seq(self.expression, self.GREATER, self.expression)
|
||||
| seq(self.expression, self.GREATEREQUAL, self.expression)
|
||||
| seq(self.expression, self.PLUS, self.expression)
|
||||
| seq(self.expression, self.MINUS, self.expression)
|
||||
| seq(self.expression, self.STAR, self.expression)
|
||||
| seq(self.expression, self.SLASH, self.expression)
|
||||
return alt(
|
||||
self.expression + self.EQUAL + self.expression,
|
||||
self.expression + self.OR + self.expression,
|
||||
self.expression + self.AND + self.expression,
|
||||
self.expression + self.EQUALEQUAL + self.expression,
|
||||
self.expression + self.BANGEQUAL + self.expression,
|
||||
self.expression + self.LESS + self.expression,
|
||||
self.expression + self.LESSEQUAL + self.expression,
|
||||
self.expression + self.GREATER + self.expression,
|
||||
self.expression + self.GREATEREQUAL + self.expression,
|
||||
self.expression + self.PLUS + self.expression,
|
||||
self.expression + self.MINUS + self.expression,
|
||||
self.expression + self.STAR + self.expression,
|
||||
self.expression + self.SLASH + self.expression,
|
||||
)
|
||||
|
||||
@rule("IsExpression")
|
||||
|
|
|
|||
|
|
@ -1715,6 +1715,17 @@ class NothingRule(Rule):
|
|||
Nothing = NothingRule()
|
||||
|
||||
|
||||
def alt(*args: Rule) -> Rule:
|
||||
"""A rule that matches one of a series of alternatives.
|
||||
|
||||
(A helper function that combines its arguments into nested alternatives.)
|
||||
"""
|
||||
result = args[0]
|
||||
for rule in args[1:]:
|
||||
result = AlternativeRule(result, rule)
|
||||
return result
|
||||
|
||||
|
||||
def seq(*args: Rule) -> Rule:
|
||||
"""A rule that matches a sequence of rules.
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue