def setUp(self): self.arith = grammar.Grammar('S', ('+', '*', '(', ')', 'id')) self.result = None def get_result(v): self.result = v return v def add(x, y): t = x + y return t def mul(x, y): t = x * y return t self.arith.add_rule('S', ['E', get_result]) self.arith.add_rule('E', ['E', '+', 'T', add]) self.arith.add_rule('E', ['T', lambda v: v]) self.arith.add_rule('T', ['T', '*', 'F', mul]) self.arith.add_rule('T', ['F', lambda v: v]) self.arith.add_rule('F', ['(', 'E', ')', lambda v: v]) self.arith.add_rule('F', ['id', lambda v: v]) self.action_table, self.goto_table, self.start_state = build_parsing_table( self.arith, LR0(self.arith.START, 0, 0)) self.driver = Driver(self.action_table, self.goto_table, self.start_state)
def setUp(self): self.lrvalue = grammar.Grammar(None, ('=', '*', ';', 'id', 'num')) self.symbol_table = dict() self.last_value = None def set_var(lv, rv): self.symbol_table[lv] = rv; return self.symbol_table[lv] def get_var(rv): if rv in self.symbol_table: return self.symbol_table[rv] raise KeyError(rv) def grab_last_value(v): self.last_value = v if isinstance(v, int) else self.symbol_table[v] return v self.lrvalue.augment('S') self.lrvalue.add_rule('S', ['E', ';', 'S', lambda e, s: s]) self.lrvalue.add_rule('S', ['E', ';', lambda v: v]) self.lrvalue.add_rule('E', ['L', '=', 'R', set_var]) self.lrvalue.add_rule('E', ['R', grab_last_value]) self.lrvalue.add_rule('L', ['*', 'R', get_var]) self.lrvalue.add_rule('L', ['id', lambda v: v]) self.lrvalue.add_rule('R', ['L', lambda v: v]) self.lrvalue.add_rule('R', ['num', lambda v: v]) self.action_table, self.goto_table, self.start_state = build_parsing_table_lalr(self.lrvalue, LR0(self.lrvalue.START, 0, 0), False) self.driver = Driver(self.action_table, self.goto_table, self.start_state)
def setUp(self): self.arith = grammar.Grammar( 'S', ('+', '*', '(', ')', 'id', 'var', '=', 'let')) self.symbol_table = [dict()] self.result = None def get_result(x): self.result = x return x def add(x, y): t = x + y return t def mul(x, y): t = x * y return t def set_var(lv, rv): self.symbol_table[-1][lv] = rv return rv def get_var(rv): for table in reversed(self.symbol_table): if rv in table: return table[rv] raise KeyError(rv) def push(): self.symbol_table.append(dict()) def pop(*others): self.symbol_table.pop() self.arith.add_rule('S', ['E', get_result]) self.arith.add_rule('E', ['E', '+', 'T', add]) self.arith.add_rule('E', ['T', lambda v: v]) self.arith.add_rule('T', ['T', '*', 'F', mul]) self.arith.add_rule('T', ['F', lambda v: v]) self.arith.add_rule('F', ['(', 'E', ')', lambda v: v]) self.arith.add_rule('F', ['id', lambda v: v]) self.arith.add_rule('F', ['var', '=', 'E', set_var]) self.arith.add_rule('F', ['var', get_var]) self.arith.add_rule('F', ['let', push, '(', 'E', ')', pop, lambda v: v]) self.action_table, self.goto_table, self.start_state = build_parsing_table( self.arith, LR0(self.arith.START, 0, 0)) self.driver = Driver(self.action_table, self.goto_table, self.start_state)
def setUp(self): self.arith = grammar.Grammar('S', ('(', ')', 'id', 'let')) self.symbol_table = [dict()] def push(*args): pass def pop(*args): pass self.arith.add_rule('S', ['E']) self.arith.add_rule('E', ['id']) self.arith.add_rule( 'E', ['let', push, '(', 'E', ')', pop, lambda *args: args]) self.action_table, self.goto_table, self.start_state = build_parsing_table( self.arith, LR0(self.arith.START, 0, 0), disable_mapping=True) self.driver = Driver(self.action_table, dict(self.goto_table), self.start_state)
def probe(*args): print "--", len(args), "-", " ".join(map(str, args)) def prompt(*args): print ">>> ", grammar = from_string(rpcalc_grammar, 'input', print_result=print_result, probe=probe, prompt=prompt, up=lambda x: x, add=lambda x, y: x + y, sub=lambda x, y: x - y, mul=lambda x, y: x * y, div=lambda x, y: x / y, mod=lambda x, y: x % y, neg=lambda x: -x) states, gotos, first = build_parsing_table(grammar, LR0(grammar.START, 0, 0)) driver = Driver(states, gotos, first) print "Reverse polish calculator. Write expressions like " print " >>> 2 + 3 (result in 2 + 3 = 5) or " print " >>> 2 + 4 * 5 (result in 2 + (4 * 5) = 22)" print prompt() driver.parse(CalcLexer(sys.stdin))
def setUp(self): syn = syntax.Syntax('input') self.result = [] syn.terminal('NL', None) syn.terminal('NUM', None) syn.terminal('+', None) syn.terminal('-', None) syn.repeat(('line', ), 'input') syn.choice((('NL', ), ('expr', 'NL', lambda x: self.result.append(x))), 'line') syn.choice((('NUM', ), ('expr', 'expr', '+', lambda x, y: x + y), ('expr', 'expr', '-', lambda x, y: x - y)), 'expr') self.grammar = syn.as_grammar() self.start_item = LR0(self.grammar.START, 0, 0) self.action_table, self.goto_table, self.start_state = build_parsing_table( self.grammar, self.start_item, disable_mapping=True) self.driver = Driver(self.action_table, self.goto_table, self.start_state) self.kernel_states = [ frozenset([ LR0(self.grammar.START, 0, 0), ]), frozenset([ LR0(self.grammar.START, 0, 1), ]), frozenset([ LR0('input', 0, 1), LR0('input', 1, 1), ]), frozenset([ LR0('line', 0, 1), ]), frozenset([ LR0('line', 1, 1), LR0('expr', 1, 1), LR0('expr', 2, 1), ]), frozenset([ LR0('expr', 0, 1), ]), frozenset([ LR0('input', 0, 2), ]), frozenset([ LR0('line', 1, 2), ]), frozenset([ LR0('expr', 1, 1), LR0('expr', 1, 2), LR0('expr', 2, 1), LR0('expr', 2, 2), ]), frozenset([ LR0('expr', 1, 3), ]), frozenset([ LR0('expr', 2, 3), ]) ]