cscg24-lolpython

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

yacc_badargs.py (1525B)


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