Update to ply 2.3
[gem5.git] / ext / ply / example / calc / calc.py
index aeb23c246cd0af523033609e224556d821bfb03e..987ce8019f72add34345f7183493c3b5040bba01 100644 (file)
@@ -5,21 +5,17 @@
 # "Lex and Yacc", p. 63.
 # -----------------------------------------------------------------------------
 
+import sys
+sys.path.insert(0,"../..")
+
 tokens = (
     'NAME','NUMBER',
-    'PLUS','MINUS','TIMES','DIVIDE','EQUALS',
-    'LPAREN','RPAREN',
     )
 
+literals = ['=','+','-','*','/', '(',')']
+
 # Tokens
 
-t_PLUS    = r'\+'
-t_MINUS   = r'-'
-t_TIMES   = r'\*'
-t_DIVIDE  = r'/'
-t_EQUALS  = r'='
-t_LPAREN  = r'\('
-t_RPAREN  = r'\)'
 t_NAME    = r'[a-zA-Z_][a-zA-Z0-9_]*'
 
 def t_NUMBER(t):
@@ -35,69 +31,69 @@ t_ignore = " \t"
 
 def t_newline(t):
     r'\n+'
-    t.lineno += t.value.count("\n")
+    t.lexer.lineno += t.value.count("\n")
 
 def t_error(t):
     print "Illegal character '%s'" % t.value[0]
-    t.skip(1)
+    t.lexer.skip(1)
 
 # Build the lexer
-import lex
+import ply.lex as lex
 lex.lex()
 
 # Parsing rules
 
 precedence = (
-    ('left','PLUS','MINUS'),
-    ('left','TIMES','DIVIDE'),
+    ('left','+','-'),
+    ('left','*','/'),
     ('right','UMINUS'),
     )
 
 # dictionary of names
 names = { }
 
-def p_statement_assign(t):
-    'statement : NAME EQUALS expression'
-    names[t[1]] = t[3]
+def p_statement_assign(p):
+    'statement : NAME "=" expression'
+    names[p[1]] = p[3]
 
-def p_statement_expr(t):
+def p_statement_expr(p):
     'statement : expression'
-    print t[1]
-
-def p_expression_binop(t):
-    '''expression : expression PLUS expression
-                  | expression MINUS expression
-                  | expression TIMES expression
-                  | expression DIVIDE expression'''
-    if t[2] == '+'  : t[0] = t[1] + t[3]
-    elif t[2] == '-': t[0] = t[1] - t[3]
-    elif t[2] == '*': t[0] = t[1] * t[3]
-    elif t[2] == '/': t[0] = t[1] / t[3]
-
-def p_expression_uminus(t):
-    'expression : MINUS expression %prec UMINUS'
-    t[0] = -t[2]
-
-def p_expression_group(t):
-    'expression : LPAREN expression RPAREN'
-    t[0] = t[2]
-
-def p_expression_number(t):
-    'expression : NUMBER'
-    t[0] = t[1]
-
-def p_expression_name(t):
-    'expression : NAME'
+    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]
+
+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:
-        t[0] = names[t[1]]
+        p[0] = names[p[1]]
     except LookupError:
-        print "Undefined name '%s'" % t[1]
-        t[0] = 0
+        print "Undefined name '%s'" % p[1]
+        p[0] = 0
 
-def p_error(t):
-    print "Syntax error at '%s'" % t.value
+def p_error(p):
+    print "Syntax error at '%s'" % p.value
 
-import yacc
+import ply.yacc as yacc
 yacc.yacc()
 
 while 1:
@@ -105,4 +101,5 @@ while 1:
         s = raw_input('calc > ')
     except EOFError:
         break
+    if not s: continue
     yacc.parse(s)