diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..de288e1 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "python.formatting.provider": "black" +} \ No newline at end of file diff --git a/blueprintcompiler/language/expression.py b/blueprintcompiler/language/expression.py index e75b961..82787ef 100644 --- a/blueprintcompiler/language/expression.py +++ b/blueprintcompiler/language/expression.py @@ -23,7 +23,7 @@ from .types import TypeName from .gtkbuilder_template import Template -expr = Pratt() +expr = Sequence() class Expr(AstNode): @@ -200,9 +200,6 @@ class ClosureExpr(Expr): expr.children = [ - Prefix(ClosureExpr), - Prefix(IdentExpr), - Prefix(["(", ExprChain, ")"]), - Infix(10, LookupOp), - Infix(10, CastExpr), + AnyOf(ClosureExpr, IdentExpr, ["(", ExprChain, ")"]), + ZeroOrMore(AnyOf(LookupOp, CastExpr)), ] diff --git a/blueprintcompiler/parse_tree.py b/blueprintcompiler/parse_tree.py index c85015a..7a44c80 100644 --- a/blueprintcompiler/parse_tree.py +++ b/blueprintcompiler/parse_tree.py @@ -594,68 +594,6 @@ class Keyword(ParseNode): return str(token) == self.kw -class Prefix(ParseNode): - def __init__(self, child): - self.child = to_parse_node(child) - - def _parse(self, ctx: ParseContext): - return self.child.parse(ctx).succeeded() - - -class Infix(ParseNode): - def __init__(self, binding_power: int, child): - self.binding_power = binding_power - self.child = to_parse_node(child) - - def _parse(self, ctx: ParseContext): - ctx.binding_power = self.binding_power - return self.child.parse(ctx).succeeded() - - def __lt__(self, other): - return self.binding_power < other.binding_power - - def __eq__(self, other): - return self.binding_power == other.binding_power - - -class Pratt(ParseNode): - """Basic Pratt parser implementation.""" - - def __init__(self, *children): - self.children = children - - @property - def children(self): - return self._children - - @children.setter - def children(self, children): - self._children = children - self.prefixes = [child for child in children if isinstance(child, Prefix)] - self.infixes = sorted( - [child for child in children if isinstance(child, Infix)], reverse=True - ) - - def _parse(self, ctx: ParseContext) -> bool: - for prefix in self.prefixes: - if prefix.parse(ctx).succeeded(): - break - else: - # none of the prefixes could be parsed - return False - - while True: - succeeded = False - for infix in self.infixes: - if infix.binding_power <= ctx.binding_power: - break - if infix.parse(ctx).succeeded(): - succeeded = True - break - if not succeeded: - return True - - def to_parse_node(value) -> ParseNode: if isinstance(value, str): return Match(value)