Skip to content

Instantly share code, notes, and snippets.

@jorendorff
Last active July 12, 2019 14:20
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jorendorff/a9f0abea330929ffe0060df51b0b8fd4 to your computer and use it in GitHub Desktop.
Save jorendorff/a9f0abea330929ffe0060df51b0b8fd4 to your computer and use it in GitHub Desktop.
import pgen_runtime
from pgen_runtime import Apply
actions = [
# 0. <empty>
{'-': 1, 'NUM': 2, 'VAR': 3, '(': 4},
# 1. "-"
{'-': 1, 'NUM': 2, 'VAR': 3, '(': 4},
# 2. NUM
{None: -9, '*': -9, '/': -9, '+': -9, '-': -9, ')': -9},
# 3. VAR
{None: -10, '*': -10, '/': -10, '+': -10, '-': -10, ')': -10},
# 4. "("
{'-': 1, 'NUM': 2, 'VAR': 3, '(': 4},
# 5. expr
{'+': 11, '-': 12, None: -9223372036854775807},
# 6. term
{'*': 13, '/': 14, None: -1, '+': -1, '-': -1, ')': -1},
# 7. unary
{None: -4, '*': -4, '/': -4, '+': -4, '-': -4, ')': -4},
# 8. prim
{None: -7, '*': -7, '/': -7, '+': -7, '-': -7, ')': -7},
# 9. "-" unary
{None: -8, '*': -8, '/': -8, '+': -8, '-': -8, ')': -8},
# 10. "(" expr
{')': 15, '+': 11, '-': 12},
# 11. expr "+"
{'-': 1, 'NUM': 2, 'VAR': 3, '(': 4},
# 12. expr "-"
{'-': 1, 'NUM': 2, 'VAR': 3, '(': 4},
# 13. term "*"
{'-': 1, 'NUM': 2, 'VAR': 3, '(': 4},
# 14. term "/"
{'-': 1, 'NUM': 2, 'VAR': 3, '(': 4},
# 15. "(" expr ")"
{None: -11, '*': -11, '/': -11, '+': -11, '-': -11, ')': -11},
# 16. expr "+" term
{'*': 13, '/': 14, None: -2, '+': -2, '-': -2, ')': -2},
# 17. expr "-" term
{'*': 13, '/': 14, None: -3, '+': -3, '-': -3, ')': -3},
# 18. term "*" unary
{None: -5, '*': -5, '/': -5, '+': -5, '-': -5, ')': -5},
# 19. term "/" unary
{None: -6, '*': -6, '/': -6, '+': -6, '-': -6, ')': -6},
]
ctns = [
{'expr': 5, 'term': 6, 'unary': 7, 'prim': 8},
{'unary': 9, 'prim': 8},
{},
{},
{'expr': 10, 'term': 6, 'unary': 7, 'prim': 8},
{},
{},
{},
{},
{},
{},
{'term': 16, 'unary': 7, 'prim': 8},
{'term': 17, 'unary': 7, 'prim': 8},
{'unary': 18, 'prim': 8},
{'unary': 19, 'prim': 8},
{},
{},
{},
{},
{},
]
reductions = [
('expr', 1, lambda builder, x0: builder.expr_P0(x0)),
('expr', 3, lambda builder, x0, x1, x2: builder.expr_P1(x0, x1, x2)),
('expr', 3, lambda builder, x0, x1, x2: builder.expr_P2(x0, x1, x2)),
('term', 1, lambda builder, x0: builder.term_P0(x0)),
('term', 3, lambda builder, x0, x1, x2: builder.term_P1(x0, x1, x2)),
('term', 3, lambda builder, x0, x1, x2: builder.term_P2(x0, x1, x2)),
('unary', 1, lambda builder, x0: builder.unary_P0(x0)),
('unary', 2, lambda builder, x0, x1: builder.unary_P1(x0, x1)),
('prim', 1, lambda builder, x0: builder.prim_P0(x0)),
('prim', 1, lambda builder, x0: builder.prim_P1(x0)),
('prim', 3, lambda builder, x0, x1, x2: builder.prim_P2(x0, x1, x2)),
]
class DefaultBuilder:
def expr_P0(self, *args): return ('expr', 0, list(args))
def expr_P1(self, *args): return ('expr', 1, list(args))
def expr_P2(self, *args): return ('expr', 2, list(args))
def term_P0(self, *args): return ('term', 0, list(args))
def term_P1(self, *args): return ('term', 1, list(args))
def term_P2(self, *args): return ('term', 2, list(args))
def unary_P0(self, *args): return ('unary', 0, list(args))
def unary_P1(self, *args): return ('unary', 1, list(args))
def prim_P0(self, *args): return ('prim', 0, list(args))
def prim_P1(self, *args): return ('prim', 1, list(args))
def prim_P2(self, *args): return ('prim', 2, list(args))
parse_expr = pgen_runtime.make_parse_fn(actions, ctns, reductions, 0, DefaultBuilder)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment