summaryrefslogtreecommitdiff
path: root/example/calcdebug/calc.py
diff options
context:
space:
mode:
Diffstat (limited to 'example/calcdebug/calc.py')
-rw-r--r--example/calcdebug/calc.py52
1 files changed, 34 insertions, 18 deletions
diff --git a/example/calcdebug/calc.py b/example/calcdebug/calc.py
index 6732f9f..06831e2 100644
--- a/example/calcdebug/calc.py
+++ b/example/calcdebug/calc.py
@@ -6,20 +6,21 @@
# -----------------------------------------------------------------------------
import sys
-sys.path.insert(0,"../..")
+sys.path.insert(0, "../..")
if sys.version_info[0] >= 3:
raw_input = input
tokens = (
- 'NAME','NUMBER',
- )
+ 'NAME', 'NUMBER',
+)
-literals = ['=','+','-','*','/', '(',')']
+literals = ['=', '+', '-', '*', '/', '(', ')']
# Tokens
-t_NAME = r'[a-zA-Z_][a-zA-Z0-9_]*'
+t_NAME = r'[a-zA-Z_][a-zA-Z0-9_]*'
+
def t_NUMBER(t):
r'\d+'
@@ -28,14 +29,16 @@ def t_NUMBER(t):
t_ignore = " \t"
+
def t_newline(t):
r'\n+'
t.lexer.lineno += t.value.count("\n")
-
+
+
def t_error(t):
print("Illegal character '%s'" % t.value[0])
t.lexer.skip(1)
-
+
# Build the lexer
import ply.lex as lex
lex.lex()
@@ -43,44 +46,55 @@ lex.lex()
# Parsing rules
precedence = (
- ('left','+','-'),
- ('left','*','/'),
- ('right','UMINUS'),
- )
+ ('left', '+', '-'),
+ ('left', '*', '/'),
+ ('right', 'UMINUS'),
+)
# dictionary of names
-names = { }
+names = {}
+
def p_statement_assign(p):
'statement : NAME "=" expression'
names[p[1]] = p[3]
+
def p_statement_expr(p):
'statement : expression'
print(p[1])
+
def p_expression_binop(p):
'''expression : expression '+' expression
| expression '-' expression
| expression '*' expression
| expression '/' expression'''
- if p[2] == '+' : p[0] = p[1] + p[3]
- elif p[2] == '-': p[0] = p[1] - p[3]
- elif p[2] == '*': p[0] = p[1] * p[3]
- elif p[2] == '/': p[0] = p[1] / p[3]
+ if p[2] == '+':
+ p[0] = p[1] + p[3]
+ elif p[2] == '-':
+ p[0] = p[1] - p[3]
+ elif p[2] == '*':
+ p[0] = p[1] * p[3]
+ elif p[2] == '/':
+ p[0] = p[1] / p[3]
+
def p_expression_uminus(p):
"expression : '-' expression %prec UMINUS"
p[0] = -p[2]
+
def p_expression_group(p):
"expression : '(' expression ')'"
p[0] = p[2]
+
def p_expression_number(p):
"expression : NUMBER"
p[0] = p[1]
+
def p_expression_name(p):
"expression : NAME"
try:
@@ -89,6 +103,7 @@ def p_expression_name(p):
print("Undefined name '%s'" % p[1])
p[0] = 0
+
def p_error(p):
if p:
print("Syntax error at '%s'" % p.value)
@@ -109,5 +124,6 @@ while 1:
s = raw_input('calc > ')
except EOFError:
break
- if not s: continue
- yacc.parse(s,debug=logging.getLogger())
+ if not s:
+ continue
+ yacc.parse(s, debug=logging.getLogger())