precedence = { '||': 5, '&&': 5, '>': 6, '>=': 6, '<=': 6, '<': 6, '==': 6, '!=': 6, '+': 7, '-': 7, '*': 8, '/': 8, 'UMINUS': 9 } tokens = list(Lexer('1+-10*123').lex()) precs = {'UMINUS': ['E', '-', 'E'], 'POSITIVE': ['E', '+', 'E']} # for t in tokens: # print(t) # print(sm.productions()) # parser = Parser(productions, terminal, nonterminal) parser = Parser(sm.productions, sm.terminal, sm.nonterminal, precedence=precedence, precs=precs) parser.generate() parser.parse(tokens, sm.sdmap) print(calls)
return left - right if op.kind == '*': return left * right if op.kind == '/': return left / right @sm.syntaxmap(['E', 'T'], [1]) @sm.syntaxmap(['T', 'F'], [1]) def texp(val): return val @sm.syntaxmap(['F', '(', 'E', ')'], [2]) def lpexp(val): return val @sm.syntaxmap(['F', 'num'], [1]) def numexp(t): # t is a token return t.val tokens = list(Lexer('1+10*123').lex()) # for t in tokens: # print(t) # print(sm.productions()) # parser = Parser(productions, terminal, nonterminal) parser = Parser(sm.productions, sm.terminal, sm.nonterminal) parser.generate(printInfo=True) parser.parse(tokens, sm.sdmap)