cscg24-lolpython

CSCG 2024 Challenge 'Can I Haz Lolpython?'
git clone https://git.sinitax.com/sinitax/cscg24-lolpython
Log | Files | Refs | sfeed.txt

yacc_rr.py (1626B)


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