Start extracting better expressions

This commit is contained in:
John Doty 2024-06-02 08:10:18 -07:00
parent e57a827e5c
commit cabc091ee4

View file

@ -1,7 +1,8 @@
# This is an example grammar. # This is an example grammar.
import re import re
from parser import Assoc, GenerateLALR, GenerateLR1, Grammar, Nothing, Terminal, rule, seq, Rule import parser
from parser import Assoc, Grammar, Nothing, Terminal, rule, seq, Rule
ARROW = Terminal("Arrow") ARROW = Terminal("Arrow")
AS = Terminal("As") AS = Terminal("As")
@ -54,7 +55,7 @@ RSQUARE = Terminal("RightBracket")
class FineGrammar(Grammar): class FineGrammar(Grammar):
generator = GenerateLALR # generator = parser.GenerateLR1
start = "File" start = "File"
def __init__(self): def __init__(self):
@ -254,7 +255,7 @@ class FineGrammar(Grammar):
@rule @rule
def primary_expression(self) -> Rule: def primary_expression(self) -> Rule:
return ( return (
IDENTIFIER self.identifier_expression
| SELF | SELF
| NUMBER | NUMBER
| STRING | STRING
@ -273,6 +274,10 @@ class FineGrammar(Grammar):
| seq(LPAREN, self.expression, RPAREN) | seq(LPAREN, self.expression, RPAREN)
) )
@rule("IdentifierExpression")
def identifier_expression(self):
return IDENTIFIER
@rule("ConditionalExpression") @rule("ConditionalExpression")
def conditional_expression(self) -> Rule: def conditional_expression(self) -> Rule:
return ( return (
@ -318,7 +323,6 @@ class FineGrammar(Grammar):
return ( return (
seq(self.variable_binding, self._pattern_core, self.pattern_predicate) seq(self.variable_binding, self._pattern_core, self.pattern_predicate)
| seq(self.variable_binding, self._pattern_core) | seq(self.variable_binding, self._pattern_core)
| seq(self._pattern_core, self.pattern_predicate)
| self._pattern_core | self._pattern_core
) )
@ -534,3 +538,7 @@ class FineTokens:
column_index = start - col_start column_index = start - col_start
value = self.src[start : start + length] value = self.src[start : start + length]
print(f"{start:04} {kind.value:12} {value} ({line_index}, {column_index})") print(f"{start:04} {kind.value:12} {value} ({line_index}, {column_index})")
if __name__ == "__main__":
FineGrammar().build_table()