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. # 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")

View file

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