Home | History | Annotate | Download | only in parsing
      1 # -----------------------------------------------------------------------------
      2 # yacc_simple.py
      3 #
      4 # A simple, properly specifier grammar
      5 # -----------------------------------------------------------------------------
      6 
      7 from .calclex import tokens
      8 from ply import yacc
      9 
     10 # Parsing rules
     11 precedence = (
     12     ('left','PLUS','MINUS'),
     13     ('left','TIMES','DIVIDE'),
     14     ('right','UMINUS'),
     15     )
     16 
     17 # dictionary of names
     18 names = { }
     19 
     20 def p_statement_assign(t):
     21     'statement : NAME EQUALS expression'
     22     names[t[1]] = t[3]
     23 
     24 def p_statement_expr(t):
     25     'statement : expression'
     26     t[0] = t[1]
     27 
     28 def p_expression_binop(t):
     29     '''expression : expression PLUS expression
     30                   | expression MINUS expression
     31                   | expression TIMES expression
     32                   | expression DIVIDE expression'''
     33     if t[2] == '+'  : t[0] = t[1] + t[3]
     34     elif t[2] == '-': t[0] = t[1] - t[3]
     35     elif t[2] == '*': t[0] = t[1] * t[3]
     36     elif t[2] == '/': t[0] = t[1] / t[3]
     37 
     38 def p_expression_uminus(t):
     39     'expression : MINUS expression %prec UMINUS'
     40     t[0] = -t[2]
     41 
     42 def p_expression_group(t):
     43     'expression : LPAREN expression RPAREN'
     44     t[0] = t[2]
     45 
     46 def p_expression_number(t):
     47     'expression : NUMBER'
     48     t[0] = t[1]
     49 
     50 def p_expression_name(t):
     51     'expression : NAME'
     52     try:
     53         t[0] = names[t[1]]
     54     except LookupError:
     55         print("Undefined name '%s'" % t[1])
     56         t[0] = 0
     57 
     58 def p_error(t):
     59     print("Syntax error at '%s'" % t.value)
     60 
     61 parser = yacc.yacc()
     62 
     63 
     64 
     65 
     66 
     67