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.
|
# 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):
|
class FineGrammar(Grammar):
|
||||||
|
|
@ -198,20 +198,20 @@ class FineGrammar(Grammar):
|
||||||
|
|
||||||
@rule("BinaryExpression")
|
@rule("BinaryExpression")
|
||||||
def binary_expression(self) -> Rule:
|
def binary_expression(self) -> Rule:
|
||||||
return (
|
return alt(
|
||||||
seq(self.expression, self.EQUAL, self.expression)
|
self.expression + self.EQUAL + self.expression,
|
||||||
| seq(self.expression, self.OR, self.expression)
|
self.expression + self.OR + self.expression,
|
||||||
| seq(self.expression, self.AND, self.expression)
|
self.expression + self.AND + self.expression,
|
||||||
| seq(self.expression, self.EQUALEQUAL, self.expression)
|
self.expression + self.EQUALEQUAL + self.expression,
|
||||||
| seq(self.expression, self.BANGEQUAL, self.expression)
|
self.expression + self.BANGEQUAL + self.expression,
|
||||||
| seq(self.expression, self.LESS, self.expression)
|
self.expression + self.LESS + self.expression,
|
||||||
| seq(self.expression, self.LESSEQUAL, self.expression)
|
self.expression + self.LESSEQUAL + self.expression,
|
||||||
| seq(self.expression, self.GREATER, self.expression)
|
self.expression + self.GREATER + self.expression,
|
||||||
| seq(self.expression, self.GREATEREQUAL, self.expression)
|
self.expression + self.GREATEREQUAL + self.expression,
|
||||||
| seq(self.expression, self.PLUS, self.expression)
|
self.expression + self.PLUS + self.expression,
|
||||||
| seq(self.expression, self.MINUS, self.expression)
|
self.expression + self.MINUS + self.expression,
|
||||||
| seq(self.expression, self.STAR, self.expression)
|
self.expression + self.STAR + self.expression,
|
||||||
| seq(self.expression, self.SLASH, self.expression)
|
self.expression + self.SLASH + self.expression,
|
||||||
)
|
)
|
||||||
|
|
||||||
@rule("IsExpression")
|
@rule("IsExpression")
|
||||||
|
|
|
||||||
|
|
@ -1715,6 +1715,17 @@ class NothingRule(Rule):
|
||||||
Nothing = NothingRule()
|
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:
|
def seq(*args: Rule) -> Rule:
|
||||||
"""A rule that matches a sequence of rules.
|
"""A rule that matches a sequence of rules.
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue