diff options
Diffstat (limited to 'src/rewriter/parser.py')
-rw-r--r-- | src/rewriter/parser.py | 13 |
1 files changed, 7 insertions, 6 deletions
diff --git a/src/rewriter/parser.py b/src/rewriter/parser.py index e69350111..e6c76a285 100644 --- a/src/rewriter/parser.py +++ b/src/rewriter/parser.py @@ -104,6 +104,7 @@ class SymbolTable: self.consts = { 're.none': App(Op.REGEXP_EMPTY, []), 're.allchar': App(Op.REGEXP_SIGMA, []), + '_': Placeholder(), } self.symbols = {} @@ -250,25 +251,25 @@ class Parser: lambda s, l, t: self.var_decl_action(t[0], t[1], t[2:]))) return (pp.Suppress('(') + pp.ZeroOrMore(decl) + pp.Suppress(')')) - def rule_action(self, name, cond, lhs, rhs, is_fixed_point): + def rule_action(self, name, cond, lhs, rhs, is_fixed_point, rhs_context): bvars = self.symbols.symbols.values() self.symbols.pop() - return Rule(name, bvars, cond, lhs, rhs, is_fixed_point) + return Rule(name, bvars, cond, lhs, rhs, is_fixed_point, rhs_context) def parse_rules(self, s): rule = ( pp.Suppress('(') + (pp.Keyword('define-rule*') | pp.Keyword('define-rule')) + - self.symbol() + self.var_list() + self.expr() + self.expr() + + self.symbol() + self.var_list() + self.expr() + self.expr() + pp.Optional(self.expr()) + pp.Suppress(')')).setParseAction(lambda s, l, t: self.rule_action( - t[1], CBool(True), t[2], t[3], t[0] == 'define-rule*')) + t[1], CBool(True), t[2], t[3], t[0] == 'define-rule*', t[4] if len(t) == 5 else None)) cond_rule = ( pp.Suppress('(') + (pp.Keyword('define-cond-rule*') | pp.Keyword('define-cond-rule')) + self.symbol() + self.var_list() + self.expr() + self.expr() + - self.expr() + + self.expr() + pp.Optional(self.expr()) + pp.Suppress(')')).setParseAction(lambda s, l, t: self.rule_action( - t[1], t[2], t[3], t[4], t[0] == 'define-cond-rule*')) + t[1], t[2], t[3], t[4], t[0] == 'define-cond-rule*', t[5] if len(t) == 6 else None)) rules = pp.OneOrMore(rule | cond_rule) + pp.StringEnd() rules.ignore(';' + pp.restOfLine) return rules.parseString(s) |