More ways of writing

Sometimes prettier
This commit is contained in:
John Doty 2024-09-01 06:52:13 -07:00
parent 3012df4ac6
commit 0354fbf4a4
2 changed files with 26 additions and 15 deletions

View file

@ -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")

View file

@ -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.