Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # -----------------------------------------------------------------------------
- # p.py
- #
- # A simple calculator with variables. This is from O'Reilly's
- # "Lex and Yacc", p. 63.
- # -----------------------------------------------------------------------------
- import sys
- sys.path.insert(0, "../..")
- if sys.version_info[0] >= 3:
- raw_input = input
- contador = 0
- tokens = (
- 'NAME', 'NUMBER',
- )
- literals = ['=', '+', '-', '*', '/', '(', ')']
- # Tokens
- t_NAME = r'[a-zA-Z_][a-zA-Z0-9_]*'
- def t_NUMBER(t):
- r'\d+'
- t.value = int(t.value)
- return 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()
- # Parsing rules
- precedence = (
- ('left', '+', '-'),
- ('left', '*', '/'),
- ('right', 'UMINUS'),
- )
- # dictionary of names
- names = { 'Z__X':'Zx',
- 'Z__A':'Za',
- 'Z__B':'Zb',
- 'Z__C':'Zc',
- 'V__ba':'Vba',
- 'V__cb':'Vcb',
- 'V__ca':'Vca',
- }
- 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'''
- global contador
- if p[2] == '+':
- print "tmp[%s] = addComplex(%s, %s);" %(contador, p[1], p[3])
- p[0] = "tmp[%s]" %(contador)
- a="%s" %(p[1])
- if a[0:3] == "tmp":
- print "destroyComplex (%s);" %(p[1])
- b="%s" %(p[3])
- if b[0:3] == "tmp":
- print "destroyComplex (%s);" %(p[3])
- contador = contador + 1
- elif p[2] == '-':
- print "tmp[%s] = subComplex(%s, %s);" %(contador, p[1], p[3])
- p[0] = "tmp[%s]" %(contador)
- a="%s" %(p[1])
- if a[0:3] == "tmp":
- print "destroyComplex (%s);" %(p[1])
- b="%s" %(p[3])
- if b[0:3] == "tmp":
- print "destroyComplex (%s);" %(p[3])
- contador = contador + 1
- elif p[2] == '*':
- print "tmp[%s] = mulComplex(%s, %s);" %(contador, p[1], p[3])
- p[0] = "tmp[%s]" %(contador)
- a="%s" %(p[1])
- if a[0:3] == "tmp":
- print "destroyComplex (%s);" %(p[1])
- b="%s" %(p[3])
- if b[0:3] == "tmp":
- print "destroyComplex (%s);" %(p[3])
- contador = contador + 1
- elif p[2] == '/':
- print "tmp[%s] = divComplex(%s, %s);" %(contador, p[1], p[3])
- p[0] = "tmp[%s]" %(contador)
- a="%s" %(p[1])
- if a[0:3] == "tmp":
- print "destroyComplex (%s);" %(p[1])
- b="%s" %(p[3])
- if b[0:3] == "tmp":
- print "destroyComplex (%s);" %(p[3])
- contador = contador + 1
- def p_expression_uminus(p):
- "expression : '-' expression %prec UMINUS"
- global contador
- print "tmp[%s] = negComplex(%s);" %(contador, p[2])
- p[0] = "tmp[%s]" %(contador)
- a="%s" %(p[2])
- if a[0:3] == "tmp":
- print "destroyComplex (%s);" %(p[2])
- contador = contador + 1
- def p_expression_group(p):
- "expression : '(' expression ')'"
- p[0] = p[2]
- def p_expression_number(p):
- "expression : NUMBER"
- global contador
- print "tmp[%s] = createComplex__mag_angle(%s, 0);" %(contador, p[1])
- p[0] = "tmp[%s]" %(contador)
- contador = contador + 1
- def p_expression_name(p):
- "expression : NAME"
- try:
- p[0] = names[p[1]]
- except LookupError:
- print("Undefined name '%s'" % p[1])
- p[0] = 0
- def p_error(p):
- if p:
- print("Syntax error at '%s'" % p.value)
- else:
- print("Syntax error at EOF")
- import ply.yacc as yacc
- yacc.yacc()
- while 1:
- try:
- s = raw_input('calc > ')
- except EOFError:
- break
- if not s:
- continue
- yacc.parse(s)
Add Comment
Please, Sign In to add comment