calc.py (4479:61d3ed46e373) | calc.py (6498:e21e9ab5fad0) |
---|---|
1# ----------------------------------------------------------------------------- 2# calc.py 3# 4# A simple calculator with variables. This is from O'Reilly's 5# "Lex and Yacc", p. 63. 6# ----------------------------------------------------------------------------- 7 8import sys 9sys.path.insert(0,"../..") 10 | 1# ----------------------------------------------------------------------------- 2# calc.py 3# 4# A simple calculator with variables. This is from O'Reilly's 5# "Lex and Yacc", p. 63. 6# ----------------------------------------------------------------------------- 7 8import sys 9sys.path.insert(0,"../..") 10 |
11if sys.version_info[0] >= 3: 12 raw_input = input 13 |
|
11tokens = ( 12 'NAME','NUMBER', 13 'PLUS','MINUS','TIMES','DIVIDE','EQUALS', 14 'LPAREN','RPAREN', 15 ) 16 17# Tokens 18 --- 6 unchanged lines hidden (view full) --- 25t_RPAREN = r'\)' 26t_NAME = r'[a-zA-Z_][a-zA-Z0-9_]*' 27 28def t_NUMBER(t): 29 r'\d+' 30 try: 31 t.value = int(t.value) 32 except ValueError: | 14tokens = ( 15 'NAME','NUMBER', 16 'PLUS','MINUS','TIMES','DIVIDE','EQUALS', 17 'LPAREN','RPAREN', 18 ) 19 20# Tokens 21 --- 6 unchanged lines hidden (view full) --- 28t_RPAREN = r'\)' 29t_NAME = r'[a-zA-Z_][a-zA-Z0-9_]*' 30 31def t_NUMBER(t): 32 r'\d+' 33 try: 34 t.value = int(t.value) 35 except ValueError: |
33 print "Integer value too large", t.value | 36 print("Integer value too large %s" % t.value) |
34 t.value = 0 35 return t 36 37t_ignore = " \t" 38 39def t_newline(t): 40 r'\n+' 41 t.lexer.lineno += t.value.count("\n") | 37 t.value = 0 38 return t 39 40t_ignore = " \t" 41 42def t_newline(t): 43 r'\n+' 44 t.lexer.lineno += t.value.count("\n") |
42 | 45 |
43def t_error(t): | 46def t_error(t): |
44 print "Illegal character '%s'" % t.value[0] | 47 print("Illegal character '%s'" % t.value[0]) |
45 t.lexer.skip(1) | 48 t.lexer.skip(1) |
46 | 49 |
47# Build the lexer 48import ply.lex as lex 49lex.lex(optimize=1) 50 51# Parsing rules 52 53precedence = ( 54 ('left','PLUS','MINUS'), --- 5 unchanged lines hidden (view full) --- 60names = { } 61 62def p_statement_assign(t): 63 'statement : NAME EQUALS expression' 64 names[t[1]] = t[3] 65 66def p_statement_expr(t): 67 'statement : expression' | 50# Build the lexer 51import ply.lex as lex 52lex.lex(optimize=1) 53 54# Parsing rules 55 56precedence = ( 57 ('left','PLUS','MINUS'), --- 5 unchanged lines hidden (view full) --- 63names = { } 64 65def p_statement_assign(t): 66 'statement : NAME EQUALS expression' 67 names[t[1]] = t[3] 68 69def p_statement_expr(t): 70 'statement : expression' |
68 print t[1] | 71 print(t[1]) |
69 70def p_expression_binop(t): 71 '''expression : expression PLUS expression 72 | expression MINUS expression 73 | expression TIMES expression 74 | expression DIVIDE expression''' 75 if t[2] == '+' : t[0] = t[1] + t[3] 76 elif t[2] == '-': t[0] = t[1] - t[3] --- 13 unchanged lines hidden (view full) --- 90 'expression : NUMBER' 91 t[0] = t[1] 92 93def p_expression_name(t): 94 'expression : NAME' 95 try: 96 t[0] = names[t[1]] 97 except LookupError: | 72 73def p_expression_binop(t): 74 '''expression : expression PLUS expression 75 | expression MINUS expression 76 | expression TIMES expression 77 | expression DIVIDE expression''' 78 if t[2] == '+' : t[0] = t[1] + t[3] 79 elif t[2] == '-': t[0] = t[1] - t[3] --- 13 unchanged lines hidden (view full) --- 93 'expression : NUMBER' 94 t[0] = t[1] 95 96def p_expression_name(t): 97 'expression : NAME' 98 try: 99 t[0] = names[t[1]] 100 except LookupError: |
98 print "Undefined name '%s'" % t[1] | 101 print("Undefined name '%s'" % t[1]) |
99 t[0] = 0 100 101def p_error(t): | 102 t[0] = 0 103 104def p_error(t): |
102 print "Syntax error at '%s'" % t.value | 105 if t: 106 print("Syntax error at '%s'" % t.value) 107 else: 108 print("Syntax error at EOF") |
103 104import ply.yacc as yacc 105yacc.yacc(optimize=1) 106 107while 1: 108 try: 109 s = raw_input('calc > ') 110 except EOFError: 111 break 112 yacc.parse(s) 113 | 109 110import ply.yacc as yacc 111yacc.yacc(optimize=1) 112 113while 1: 114 try: 115 s = raw_input('calc > ') 116 except EOFError: 117 break 118 yacc.parse(s) 119 |