def test(): jsonpath = sys.argv[1] label = sys.argv[2] print "jsonpath:" + jsonpath lj = utility.LoadJSON("employee.json") j = lj.get_json() #print j #print x["personalRecord"]["name"] la = LexicalAnalyzer(jsonpath) token_p = la.token_pair() q = Query({"data": j}, token_p) print json.dumps(q.execute(), indent=4, sort_keys=True) filtered_content = Policy().keep_label(q.execute(), label, []) print json.dumps(filtered_content, indent=4, sort_keys=True)
def query(self, path): if path == "/": #print "returing root obj----------------" #print id( self.tree_root) return [self.tree_root] path_token = LexicalAnalyzer(path).token_pair() ini_nodes = [self.tree_root] final_nodes = [] token_pair = path_token for tp in token_pair: (t1, t2) = tp final_nodes = [] if t1 == "child": for root in ini_nodes: # looking into the object for n in root.obj_mem: for (k, v) in n.items(): if k == t2: final_nodes.append(v) for n in root.prim_mem: (k, v) = n.items()[0] if k == t2: final_nodes.append(v) pass elif t1 == "index": for root in ini_nodes: t2 = int(t2) try: n = root.array_mem[t2] except: pass final_nodes.append(n) pass elif t1 == "gap": for root in ini_nodes: final_nodes = final_nodes + self._gapvalue(t2, root) pass ini_nodes = final_nodes return final_nodes
def nextToken(self): if (self.index + 1) < len(self.list_tokens): self.index += 1 #print(self.list_tokens[self.index]) #self.showStack() return self.list_tokens[self.index] else: sys.exit("out range") def syntaxError(self, expected): ct = self.getCurrentToken() sys.exit( 'Syntax error, "{}" expected but "{}" found in line {}'.format( expected, ct.token, ct.line)) def getCurrentToken(self): #print '[getCurrentToken]: {}'.format(self.list_tokens[self.index]) return self.list_tokens[self.index] def showStack(self): print("########") for line in traceback.format_stack(): print(line) print("########") file_path = '../program.txt' p = open(file_path, "r").read() lex = LexicalAnalyzer(p).parse() SyntacticAnalyzer(lex).program()
from lexical_analyzer import LexicalAnalyzer from syntax_analyzer import SyntaxAnalyzer from parse_table import TableGenerator # project 1: run lexical analyzer and create token file print '...Starting Lexical Analyzer' lex = LexicalAnalyzer() lex.process_file() print 'Lexical Analyzer has finished running.\n' # # project 2: create parse table # print '...Starting Parse Table generator' # tbl = TableGenerator() # tbl.generate_parse_table() # print 'Parse Table created.\n' # project 2: run syntax analyzer print '...Starting Syntax Analyzer' symbol_table = lex.get_symbol_table() syn = SyntaxAnalyzer(symbol_table) print 'Syntax Analyzer has finished running.\n'
ap = argparse.ArgumentParser() ap.add_argument("-f", "--file", required = True, help = "Path to file") ap.add_argument("-n", "--name", required = False, help = "Name of the generated python file") args = vars(ap.parse_args()) if not args: exit() f = args['file'].split('.') if 'asm' != f[-1]: print 'Invalid file.' exit() try: la = LexicalAnalyzer() tokens = la.tokenize(args["file"]) sxa = SyntaxAnalyzer() exprs = sxa.analyze(tokens) ssa = SemanticsAnalyzer() ssa.analyze(exprs) cg = CodeGeneratorFactory.create('python') filename = 'a' if not args['name'] else args['name'] cg.generate(exprs, filename) except Exception as e: print e
from lexical_analyzer import LexicalAnalyzer from syntatic_analyzer import SyntaticAnalyzer INPUT_FILE = 'input' if __name__ == '__main__': LA = LexicalAnalyzer(INPUT_FILE) SA = SyntaticAnalyzer(LA, debug=True) ast = SA.analyze() if ast: ast.traverse() # token, value = LA.get_next_token() # while token: # print(f'Token: {token} - value: {value}') # token, value = LA.get_next_token()
def __init__(self): self.lex = LexicalAnalyzer() t = ParsingTable() t.add_action(0, Token.ID, Action.S, 3) t.add_action(0, Token.NUMBER, Action.S, 10) t.add_action(0, Token.CMD_EXIT, Action.S, 2) t.add_action(0, Token.CMD_LIST, Action.S, 2) t.add_action(0, Token.CMD_CLEAR, Action.S, 2) t.add_action(0, Token.OP_PLUS, Action.S, 8) t.add_action(0, Token.OP_MINUS, Action.S, 9) t.add_action(0, Token.EOS, Action.S, 1) t.add_action(0, Token.OP_LPAREN, Action.S, 11) t.add_action(1, Token.EOS, Action.ACCEPT, -1) t.add_action(2, Token.EOS, Action.R, 1) t.add_action(3, Token.OP_ASSIGN, Action.S, 12) t.add_action(3, Token.OP_PLUS, Action.R, 16) t.add_action(3, Token.OP_MINUS, Action.R, 16) t.add_action(3, Token.OP_MUL, Action.R, 16) t.add_action(3, Token.OP_DIV, Action.R, 16) t.add_action(3, Token.OP_POW, Action.R, 16) t.add_action(3, Token.OP_RPAREN, Action.R, 16) t.add_action(3, Token.EOS, Action.R, 16) t.add_action(4, Token.OP_PLUS, Action.S, 13) t.add_action(4, Token.OP_MINUS, Action.S, 14) t.add_action(4, Token.EOS, Action.R, 3) t.add_action(5, Token.OP_PLUS, Action.R, 6) t.add_action(5, Token.OP_MINUS, Action.R, 6) t.add_action(5, Token.OP_MUL, Action.S, 15) t.add_action(5, Token.OP_DIV, Action.S, 16) t.add_action(5, Token.OP_RPAREN, Action.R, 6) t.add_action(5, Token.EOS, Action.R, 6) t.add_action(6, Token.OP_PLUS, Action.R, 9) t.add_action(6, Token.OP_MINUS, Action.R, 9) t.add_action(6, Token.OP_MUL, Action.R, 9) t.add_action(6, Token.OP_DIV, Action.R, 9) t.add_action(6, Token.OP_RPAREN, Action.R, 9) t.add_action(6, Token.EOS, Action.R, 9) t.add_action(7, Token.OP_PLUS, Action.R, 10) t.add_action(7, Token.OP_MINUS, Action.R, 10) t.add_action(7, Token.OP_MUL, Action.R, 10) t.add_action(7, Token.OP_DIV, Action.R, 10) t.add_action(7, Token.OP_POW, Action.S, 17) t.add_action(7, Token.OP_RPAREN, Action.R, 10) t.add_action(7, Token.EOS, Action.R, 10) t.add_action(8, Token.ID, Action.S, 20) t.add_action(8, Token.NUMBER, Action.S, 10) t.add_action(8, Token.OP_LPAREN, Action.S, 11) t.add_action(9, Token.ID, Action.S, 20) t.add_action(9, Token.NUMBER, Action.S, 10) t.add_action(9, Token.OP_LPAREN, Action.S, 11) t.add_action(10, Token.OP_PLUS, Action.R, 17) t.add_action(10, Token.OP_MINUS, Action.R, 17) t.add_action(10, Token.OP_MUL, Action.R, 17) t.add_action(10, Token.OP_DIV, Action.R, 17) t.add_action(10, Token.OP_POW, Action.R, 17) t.add_action(10, Token.OP_RPAREN, Action.R, 17) t.add_action(10, Token.EOS, Action.R, 17) t.add_action(11, Token.ID, Action.S, 20) t.add_action(11, Token.NUMBER, Action.S, 10) t.add_action(11, Token.OP_PLUS, Action.S, 8) t.add_action(11, Token.OP_MINUS, Action.S, 9) t.add_action(11, Token.OP_LPAREN, Action.S, 11) t.add_action(12, Token.ID, Action.S, 20) t.add_action(12, Token.NUMBER, Action.S, 10) t.add_action(12, Token.OP_PLUS, Action.S, 8) t.add_action(12, Token.OP_MINUS, Action.S, 9) t.add_action(12, Token.OP_LPAREN, Action.S, 11) t.add_action(13, Token.ID, Action.S, 20) t.add_action(13, Token.NUMBER, Action.S, 10) t.add_action(13, Token.OP_PLUS, Action.S, 8) t.add_action(13, Token.OP_MINUS, Action.S, 9) t.add_action(13, Token.OP_LPAREN, Action.S, 11) t.add_action(14, Token.ID, Action.S, 20) t.add_action(14, Token.NUMBER, Action.S, 10) t.add_action(14, Token.OP_PLUS, Action.S, 8) t.add_action(14, Token.OP_MINUS, Action.S, 9) t.add_action(14, Token.OP_LPAREN, Action.S, 11) t.add_action(15, Token.ID, Action.S, 20) t.add_action(15, Token.NUMBER, Action.S, 10) t.add_action(15, Token.OP_PLUS, Action.S, 8) t.add_action(15, Token.OP_MINUS, Action.S, 9) t.add_action(15, Token.OP_LPAREN, Action.S, 11) t.add_action(16, Token.ID, Action.S, 20) t.add_action(16, Token.NUMBER, Action.S, 10) t.add_action(16, Token.OP_PLUS, Action.S, 8) t.add_action(16, Token.OP_MINUS, Action.S, 9) t.add_action(16, Token.OP_LPAREN, Action.S, 11) t.add_action(17, Token.ID, Action.S, 20) t.add_action(17, Token.NUMBER, Action.S, 10) t.add_action(17, Token.OP_PLUS, Action.S, 8) t.add_action(17, Token.OP_MINUS, Action.S, 9) t.add_action(17, Token.OP_LPAREN, Action.S, 11) t.add_action(18, Token.OP_PLUS, Action.R, 12) t.add_action(18, Token.OP_MINUS, Action.R, 12) t.add_action(18, Token.OP_MUL, Action.R, 12) t.add_action(18, Token.OP_DIV, Action.R, 12) t.add_action(18, Token.OP_POW, Action.S, 28) t.add_action(18, Token.OP_RPAREN, Action.R, 12) t.add_action(18, Token.EOS, Action.R, 12) t.add_action(19, Token.OP_PLUS, Action.R, 14) t.add_action(19, Token.OP_MINUS, Action.R, 14) t.add_action(19, Token.OP_MUL, Action.R, 14) t.add_action(19, Token.OP_DIV, Action.R, 14) t.add_action(19, Token.OP_POW, Action.S, 29) t.add_action(19, Token.OP_RPAREN, Action.R, 14) t.add_action(19, Token.EOS, Action.R, 14) t.add_action(20, Token.OP_PLUS, Action.R, 16) t.add_action(20, Token.OP_MINUS, Action.R, 16) t.add_action(20, Token.OP_MUL, Action.R, 16) t.add_action(20, Token.OP_DIV, Action.R, 16) t.add_action(20, Token.OP_POW, Action.R, 16) t.add_action(20, Token.OP_RPAREN, Action.R, 16) t.add_action(20, Token.EOS, Action.R, 16) t.add_action(21, Token.OP_PLUS, Action.S, 13) t.add_action(21, Token.OP_MINUS, Action.S, 14) t.add_action(21, Token.OP_RPAREN, Action.S, 30) t.add_action(22, Token.OP_PLUS, Action.S, 13) t.add_action(22, Token.OP_MINUS, Action.S, 14) t.add_action(22, Token.EOS, Action.R, 2) t.add_action(23, Token.OP_PLUS, Action.R, 4) t.add_action(23, Token.OP_MINUS, Action.R, 4) t.add_action(23, Token.OP_MUL, Action.S, 15) t.add_action(23, Token.OP_DIV, Action.S, 16) t.add_action(23, Token.OP_RPAREN, Action.R, 4) t.add_action(23, Token.EOS, Action.R, 4) t.add_action(24, Token.OP_PLUS, Action.R, 5) t.add_action(24, Token.OP_MINUS, Action.R, 5) t.add_action(24, Token.OP_MUL, Action.S, 15) t.add_action(24, Token.OP_DIV, Action.S, 16) t.add_action(24, Token.OP_RPAREN, Action.R, 5) t.add_action(24, Token.EOS, Action.R, 5) t.add_action(25, Token.OP_PLUS, Action.R, 7) t.add_action(25, Token.OP_MINUS, Action.R, 7) t.add_action(25, Token.OP_MUL, Action.R, 7) t.add_action(25, Token.OP_DIV, Action.R, 7) t.add_action(25, Token.OP_RPAREN, Action.R, 7) t.add_action(25, Token.EOS, Action.R, 7) t.add_action(26, Token.OP_PLUS, Action.R, 8) t.add_action(26, Token.OP_MINUS, Action.R, 8) t.add_action(26, Token.OP_MUL, Action.R, 8) t.add_action(26, Token.OP_DIV, Action.R, 8) t.add_action(26, Token.OP_RPAREN, Action.R, 8) t.add_action(26, Token.EOS, Action.R, 8) t.add_action(27, Token.OP_PLUS, Action.R, 11) t.add_action(27, Token.OP_MINUS, Action.R, 11) t.add_action(27, Token.OP_MUL, Action.R, 11) t.add_action(27, Token.OP_DIV, Action.R, 11) t.add_action(27, Token.OP_RPAREN, Action.R, 11) t.add_action(27, Token.EOS, Action.R, 11) t.add_action(28, Token.ID, Action.S, 20) t.add_action(28, Token.NUMBER, Action.S, 10) t.add_action(28, Token.OP_PLUS, Action.S, 8) t.add_action(28, Token.OP_MINUS, Action.S, 9) t.add_action(28, Token.OP_LPAREN, Action.S, 11) t.add_action(29, Token.ID, Action.S, 20) t.add_action(29, Token.NUMBER, Action.S, 10) t.add_action(29, Token.OP_PLUS, Action.S, 8) t.add_action(29, Token.OP_MINUS, Action.S, 9) t.add_action(29, Token.OP_LPAREN, Action.S, 11) t.add_action(30, Token.OP_PLUS, Action.R, 18) t.add_action(30, Token.OP_MINUS, Action.R, 18) t.add_action(30, Token.OP_MUL, Action.R, 18) t.add_action(30, Token.OP_DIV, Action.R, 18) t.add_action(30, Token.OP_POW, Action.R, 18) t.add_action(30, Token.OP_RPAREN, Action.R, 18) t.add_action(30, Token.EOS, Action.R, 18) t.add_action(31, Token.OP_PLUS, Action.R, 13) t.add_action(31, Token.OP_MINUS, Action.R, 13) t.add_action(31, Token.OP_MUL, Action.R, 13) t.add_action(31, Token.OP_DIV, Action.R, 13) t.add_action(31, Token.OP_RPAREN, Action.R, 13) t.add_action(31, Token.EOS, Action.R, 13) t.add_action(32, Token.OP_PLUS, Action.R, 15) t.add_action(32, Token.OP_MINUS, Action.R, 15) t.add_action(32, Token.OP_MUL, Action.R, 15) t.add_action(32, Token.OP_DIV, Action.R, 15) t.add_action(32, Token.OP_RPAREN, Action.R, 15) t.add_action(32, Token.EOS, Action.R, 15) t.add_goto(0, Terminal.S, 1) t.add_goto(0, Terminal.E, 4) t.add_goto(0, Terminal.T, 5) t.add_goto(0, Terminal.F, 6) t.add_goto(0, Terminal.B, 7) t.add_goto(8, Terminal.B, 18) t.add_goto(9, Terminal.B, 19) t.add_goto(11, Terminal.E, 21) t.add_goto(11, Terminal.T, 5) t.add_goto(11, Terminal.F, 6) t.add_goto(11, Terminal.B, 7) t.add_goto(12, Terminal.E, 22) t.add_goto(12, Terminal.T, 5) t.add_goto(12, Terminal.F, 6) t.add_goto(12, Terminal.B, 7) t.add_goto(13, Terminal.T, 23) t.add_goto(13, Terminal.F, 6) t.add_goto(13, Terminal.B, 7) t.add_goto(14, Terminal.T, 24) t.add_goto(14, Terminal.F, 6) t.add_goto(14, Terminal.B, 7) t.add_goto(15, Terminal.F, 25) t.add_goto(15, Terminal.B, 7) t.add_goto(16, Terminal.F, 26) t.add_goto(16, Terminal.B, 7) t.add_goto(17, Terminal.F, 27) t.add_goto(17, Terminal.B, 7) t.add_goto(28, Terminal.F, 31) t.add_goto(28, Terminal.B, 7) t.add_goto(29, Terminal.F, 32) t.add_goto(29, Terminal.B, 7) t.add_rhs(1, 1) t.add_rhs(2, 3) t.add_rhs(3, 1) t.add_rhs(4, 3) t.add_rhs(5, 3) t.add_rhs(6, 1) t.add_rhs(7, 3) t.add_rhs(8, 3) t.add_rhs(9, 1) t.add_rhs(10, 1) t.add_rhs(11, 3) t.add_rhs(12, 2) t.add_rhs(13, 4) t.add_rhs(14, 2) t.add_rhs(15, 4) t.add_rhs(16, 1) t.add_rhs(17, 1) t.add_rhs(18, 3) t.add_lhs(1, Terminal.S) t.add_lhs(2, Terminal.S) t.add_lhs(3, Terminal.S) t.add_lhs(4, Terminal.E) t.add_lhs(5, Terminal.E) t.add_lhs(6, Terminal.E) t.add_lhs(7, Terminal.T) t.add_lhs(8, Terminal.T) t.add_lhs(9, Terminal.T) t.add_lhs(10, Terminal.F) t.add_lhs(11, Terminal.F) t.add_lhs(12, Terminal.F) t.add_lhs(13, Terminal.F) t.add_lhs(14, Terminal.F) t.add_lhs(15, Terminal.F) t.add_lhs(16, Terminal.B) t.add_lhs(17, Terminal.B) t.add_lhs(18, Terminal.B) # print t self.table = t
class Parser: def __init__(self): self.lex = LexicalAnalyzer() t = ParsingTable() t.add_action(0, Token.ID, Action.S, 3) t.add_action(0, Token.NUMBER, Action.S, 10) t.add_action(0, Token.CMD_EXIT, Action.S, 2) t.add_action(0, Token.CMD_LIST, Action.S, 2) t.add_action(0, Token.CMD_CLEAR, Action.S, 2) t.add_action(0, Token.OP_PLUS, Action.S, 8) t.add_action(0, Token.OP_MINUS, Action.S, 9) t.add_action(0, Token.EOS, Action.S, 1) t.add_action(0, Token.OP_LPAREN, Action.S, 11) t.add_action(1, Token.EOS, Action.ACCEPT, -1) t.add_action(2, Token.EOS, Action.R, 1) t.add_action(3, Token.OP_ASSIGN, Action.S, 12) t.add_action(3, Token.OP_PLUS, Action.R, 16) t.add_action(3, Token.OP_MINUS, Action.R, 16) t.add_action(3, Token.OP_MUL, Action.R, 16) t.add_action(3, Token.OP_DIV, Action.R, 16) t.add_action(3, Token.OP_POW, Action.R, 16) t.add_action(3, Token.OP_RPAREN, Action.R, 16) t.add_action(3, Token.EOS, Action.R, 16) t.add_action(4, Token.OP_PLUS, Action.S, 13) t.add_action(4, Token.OP_MINUS, Action.S, 14) t.add_action(4, Token.EOS, Action.R, 3) t.add_action(5, Token.OP_PLUS, Action.R, 6) t.add_action(5, Token.OP_MINUS, Action.R, 6) t.add_action(5, Token.OP_MUL, Action.S, 15) t.add_action(5, Token.OP_DIV, Action.S, 16) t.add_action(5, Token.OP_RPAREN, Action.R, 6) t.add_action(5, Token.EOS, Action.R, 6) t.add_action(6, Token.OP_PLUS, Action.R, 9) t.add_action(6, Token.OP_MINUS, Action.R, 9) t.add_action(6, Token.OP_MUL, Action.R, 9) t.add_action(6, Token.OP_DIV, Action.R, 9) t.add_action(6, Token.OP_RPAREN, Action.R, 9) t.add_action(6, Token.EOS, Action.R, 9) t.add_action(7, Token.OP_PLUS, Action.R, 10) t.add_action(7, Token.OP_MINUS, Action.R, 10) t.add_action(7, Token.OP_MUL, Action.R, 10) t.add_action(7, Token.OP_DIV, Action.R, 10) t.add_action(7, Token.OP_POW, Action.S, 17) t.add_action(7, Token.OP_RPAREN, Action.R, 10) t.add_action(7, Token.EOS, Action.R, 10) t.add_action(8, Token.ID, Action.S, 20) t.add_action(8, Token.NUMBER, Action.S, 10) t.add_action(8, Token.OP_LPAREN, Action.S, 11) t.add_action(9, Token.ID, Action.S, 20) t.add_action(9, Token.NUMBER, Action.S, 10) t.add_action(9, Token.OP_LPAREN, Action.S, 11) t.add_action(10, Token.OP_PLUS, Action.R, 17) t.add_action(10, Token.OP_MINUS, Action.R, 17) t.add_action(10, Token.OP_MUL, Action.R, 17) t.add_action(10, Token.OP_DIV, Action.R, 17) t.add_action(10, Token.OP_POW, Action.R, 17) t.add_action(10, Token.OP_RPAREN, Action.R, 17) t.add_action(10, Token.EOS, Action.R, 17) t.add_action(11, Token.ID, Action.S, 20) t.add_action(11, Token.NUMBER, Action.S, 10) t.add_action(11, Token.OP_PLUS, Action.S, 8) t.add_action(11, Token.OP_MINUS, Action.S, 9) t.add_action(11, Token.OP_LPAREN, Action.S, 11) t.add_action(12, Token.ID, Action.S, 20) t.add_action(12, Token.NUMBER, Action.S, 10) t.add_action(12, Token.OP_PLUS, Action.S, 8) t.add_action(12, Token.OP_MINUS, Action.S, 9) t.add_action(12, Token.OP_LPAREN, Action.S, 11) t.add_action(13, Token.ID, Action.S, 20) t.add_action(13, Token.NUMBER, Action.S, 10) t.add_action(13, Token.OP_PLUS, Action.S, 8) t.add_action(13, Token.OP_MINUS, Action.S, 9) t.add_action(13, Token.OP_LPAREN, Action.S, 11) t.add_action(14, Token.ID, Action.S, 20) t.add_action(14, Token.NUMBER, Action.S, 10) t.add_action(14, Token.OP_PLUS, Action.S, 8) t.add_action(14, Token.OP_MINUS, Action.S, 9) t.add_action(14, Token.OP_LPAREN, Action.S, 11) t.add_action(15, Token.ID, Action.S, 20) t.add_action(15, Token.NUMBER, Action.S, 10) t.add_action(15, Token.OP_PLUS, Action.S, 8) t.add_action(15, Token.OP_MINUS, Action.S, 9) t.add_action(15, Token.OP_LPAREN, Action.S, 11) t.add_action(16, Token.ID, Action.S, 20) t.add_action(16, Token.NUMBER, Action.S, 10) t.add_action(16, Token.OP_PLUS, Action.S, 8) t.add_action(16, Token.OP_MINUS, Action.S, 9) t.add_action(16, Token.OP_LPAREN, Action.S, 11) t.add_action(17, Token.ID, Action.S, 20) t.add_action(17, Token.NUMBER, Action.S, 10) t.add_action(17, Token.OP_PLUS, Action.S, 8) t.add_action(17, Token.OP_MINUS, Action.S, 9) t.add_action(17, Token.OP_LPAREN, Action.S, 11) t.add_action(18, Token.OP_PLUS, Action.R, 12) t.add_action(18, Token.OP_MINUS, Action.R, 12) t.add_action(18, Token.OP_MUL, Action.R, 12) t.add_action(18, Token.OP_DIV, Action.R, 12) t.add_action(18, Token.OP_POW, Action.S, 28) t.add_action(18, Token.OP_RPAREN, Action.R, 12) t.add_action(18, Token.EOS, Action.R, 12) t.add_action(19, Token.OP_PLUS, Action.R, 14) t.add_action(19, Token.OP_MINUS, Action.R, 14) t.add_action(19, Token.OP_MUL, Action.R, 14) t.add_action(19, Token.OP_DIV, Action.R, 14) t.add_action(19, Token.OP_POW, Action.S, 29) t.add_action(19, Token.OP_RPAREN, Action.R, 14) t.add_action(19, Token.EOS, Action.R, 14) t.add_action(20, Token.OP_PLUS, Action.R, 16) t.add_action(20, Token.OP_MINUS, Action.R, 16) t.add_action(20, Token.OP_MUL, Action.R, 16) t.add_action(20, Token.OP_DIV, Action.R, 16) t.add_action(20, Token.OP_POW, Action.R, 16) t.add_action(20, Token.OP_RPAREN, Action.R, 16) t.add_action(20, Token.EOS, Action.R, 16) t.add_action(21, Token.OP_PLUS, Action.S, 13) t.add_action(21, Token.OP_MINUS, Action.S, 14) t.add_action(21, Token.OP_RPAREN, Action.S, 30) t.add_action(22, Token.OP_PLUS, Action.S, 13) t.add_action(22, Token.OP_MINUS, Action.S, 14) t.add_action(22, Token.EOS, Action.R, 2) t.add_action(23, Token.OP_PLUS, Action.R, 4) t.add_action(23, Token.OP_MINUS, Action.R, 4) t.add_action(23, Token.OP_MUL, Action.S, 15) t.add_action(23, Token.OP_DIV, Action.S, 16) t.add_action(23, Token.OP_RPAREN, Action.R, 4) t.add_action(23, Token.EOS, Action.R, 4) t.add_action(24, Token.OP_PLUS, Action.R, 5) t.add_action(24, Token.OP_MINUS, Action.R, 5) t.add_action(24, Token.OP_MUL, Action.S, 15) t.add_action(24, Token.OP_DIV, Action.S, 16) t.add_action(24, Token.OP_RPAREN, Action.R, 5) t.add_action(24, Token.EOS, Action.R, 5) t.add_action(25, Token.OP_PLUS, Action.R, 7) t.add_action(25, Token.OP_MINUS, Action.R, 7) t.add_action(25, Token.OP_MUL, Action.R, 7) t.add_action(25, Token.OP_DIV, Action.R, 7) t.add_action(25, Token.OP_RPAREN, Action.R, 7) t.add_action(25, Token.EOS, Action.R, 7) t.add_action(26, Token.OP_PLUS, Action.R, 8) t.add_action(26, Token.OP_MINUS, Action.R, 8) t.add_action(26, Token.OP_MUL, Action.R, 8) t.add_action(26, Token.OP_DIV, Action.R, 8) t.add_action(26, Token.OP_RPAREN, Action.R, 8) t.add_action(26, Token.EOS, Action.R, 8) t.add_action(27, Token.OP_PLUS, Action.R, 11) t.add_action(27, Token.OP_MINUS, Action.R, 11) t.add_action(27, Token.OP_MUL, Action.R, 11) t.add_action(27, Token.OP_DIV, Action.R, 11) t.add_action(27, Token.OP_RPAREN, Action.R, 11) t.add_action(27, Token.EOS, Action.R, 11) t.add_action(28, Token.ID, Action.S, 20) t.add_action(28, Token.NUMBER, Action.S, 10) t.add_action(28, Token.OP_PLUS, Action.S, 8) t.add_action(28, Token.OP_MINUS, Action.S, 9) t.add_action(28, Token.OP_LPAREN, Action.S, 11) t.add_action(29, Token.ID, Action.S, 20) t.add_action(29, Token.NUMBER, Action.S, 10) t.add_action(29, Token.OP_PLUS, Action.S, 8) t.add_action(29, Token.OP_MINUS, Action.S, 9) t.add_action(29, Token.OP_LPAREN, Action.S, 11) t.add_action(30, Token.OP_PLUS, Action.R, 18) t.add_action(30, Token.OP_MINUS, Action.R, 18) t.add_action(30, Token.OP_MUL, Action.R, 18) t.add_action(30, Token.OP_DIV, Action.R, 18) t.add_action(30, Token.OP_POW, Action.R, 18) t.add_action(30, Token.OP_RPAREN, Action.R, 18) t.add_action(30, Token.EOS, Action.R, 18) t.add_action(31, Token.OP_PLUS, Action.R, 13) t.add_action(31, Token.OP_MINUS, Action.R, 13) t.add_action(31, Token.OP_MUL, Action.R, 13) t.add_action(31, Token.OP_DIV, Action.R, 13) t.add_action(31, Token.OP_RPAREN, Action.R, 13) t.add_action(31, Token.EOS, Action.R, 13) t.add_action(32, Token.OP_PLUS, Action.R, 15) t.add_action(32, Token.OP_MINUS, Action.R, 15) t.add_action(32, Token.OP_MUL, Action.R, 15) t.add_action(32, Token.OP_DIV, Action.R, 15) t.add_action(32, Token.OP_RPAREN, Action.R, 15) t.add_action(32, Token.EOS, Action.R, 15) t.add_goto(0, Terminal.S, 1) t.add_goto(0, Terminal.E, 4) t.add_goto(0, Terminal.T, 5) t.add_goto(0, Terminal.F, 6) t.add_goto(0, Terminal.B, 7) t.add_goto(8, Terminal.B, 18) t.add_goto(9, Terminal.B, 19) t.add_goto(11, Terminal.E, 21) t.add_goto(11, Terminal.T, 5) t.add_goto(11, Terminal.F, 6) t.add_goto(11, Terminal.B, 7) t.add_goto(12, Terminal.E, 22) t.add_goto(12, Terminal.T, 5) t.add_goto(12, Terminal.F, 6) t.add_goto(12, Terminal.B, 7) t.add_goto(13, Terminal.T, 23) t.add_goto(13, Terminal.F, 6) t.add_goto(13, Terminal.B, 7) t.add_goto(14, Terminal.T, 24) t.add_goto(14, Terminal.F, 6) t.add_goto(14, Terminal.B, 7) t.add_goto(15, Terminal.F, 25) t.add_goto(15, Terminal.B, 7) t.add_goto(16, Terminal.F, 26) t.add_goto(16, Terminal.B, 7) t.add_goto(17, Terminal.F, 27) t.add_goto(17, Terminal.B, 7) t.add_goto(28, Terminal.F, 31) t.add_goto(28, Terminal.B, 7) t.add_goto(29, Terminal.F, 32) t.add_goto(29, Terminal.B, 7) t.add_rhs(1, 1) t.add_rhs(2, 3) t.add_rhs(3, 1) t.add_rhs(4, 3) t.add_rhs(5, 3) t.add_rhs(6, 1) t.add_rhs(7, 3) t.add_rhs(8, 3) t.add_rhs(9, 1) t.add_rhs(10, 1) t.add_rhs(11, 3) t.add_rhs(12, 2) t.add_rhs(13, 4) t.add_rhs(14, 2) t.add_rhs(15, 4) t.add_rhs(16, 1) t.add_rhs(17, 1) t.add_rhs(18, 3) t.add_lhs(1, Terminal.S) t.add_lhs(2, Terminal.S) t.add_lhs(3, Terminal.S) t.add_lhs(4, Terminal.E) t.add_lhs(5, Terminal.E) t.add_lhs(6, Terminal.E) t.add_lhs(7, Terminal.T) t.add_lhs(8, Terminal.T) t.add_lhs(9, Terminal.T) t.add_lhs(10, Terminal.F) t.add_lhs(11, Terminal.F) t.add_lhs(12, Terminal.F) t.add_lhs(13, Terminal.F) t.add_lhs(14, Terminal.F) t.add_lhs(15, Terminal.F) t.add_lhs(16, Terminal.B) t.add_lhs(17, Terminal.B) t.add_lhs(18, Terminal.B) # print t self.table = t def parseIntputString(self, input_str): self.init_stack() self.lex.set_input(input_str) error = False for (token, token_string) in self.lex: while True: try: (action, arg) = self.table.get_action(self.current_state, token) #print 'PARSER: In state %s with token %s, do %s with arg %s' % (self.current_state, token, action, arg) except TypeError: # probably returned None #print 'PARSER: No action for state %s with token %s, error !' % (self.current_state, token) error = True break if action == Action.S: if arg == None: error = True break self.push_state(arg) yield (Action.S, token_string, None) break elif action == Action.R: if arg == None: error = True break rhs = self.table.get_rhs(arg) lhs = self.table.get_lhs(arg) if lhs == None or rhs == None: error = True break self.pop_states(rhs) goto = self.table.get_goto(self.current_state, lhs) if goto == None: error = True break self.push_state(goto) yield (Action.R, arg, rhs) elif action == Action.ACCEPT: raise StopIteration else: error = True break if error: raise ParserException() break def init_stack(self): self.stack = [0] def push_state(self, state): self.stack.append(state) def pop_states(self, number): for i in range(number): self.stack.pop() @property def current_state(self): return self.stack[-1]