fork download
  1.  
  2.  
  3. # -----------------------------------------------------------------------------
  4. # calc.py
  5. #
  6. # A simple calculator with variables. This is from O'Reilly's
  7. # "Lex and Yacc", p. 63.
  8. # -----------------------------------------------------------------------------
  9.  
  10. import sys
  11. sys.path.insert(0,"../..")
  12.  
  13. tokens = (
  14. 'NAME','NUMBER',
  15. )
  16.  
  17. literals = ['=','+','-','*','/', '(',')']
  18.  
  19. # Tokens
  20.  
  21. t_NAME = r'[a-zA-Z_][a-zA-Z0-9_]*'
  22.  
  23. def t_NUMBER(t):
  24. r'\d+'
  25. try:
  26. t.value = int(t.value)
  27. except ValueError:
  28. print "Integer value too large", t.value
  29. t.value = 0
  30. return t
  31.  
  32. t_ignore = " \t"
  33.  
  34. def t_newline(t):
  35. r'\n+'
  36. t.lexer.lineno += t.value.count("\n")
  37.  
  38. def t_error(t):
  39. print "Illegal character '%s'" % t.value[0]
  40. t.lexer.skip(1)
  41.  
  42. # Build the lexer
  43. import ply.lex as lex
  44. lex.lex()
  45.  
  46. # Parsing rules
  47.  
  48. precedence = (
  49. ('left','+','-'),
  50. ('left','*','/'),
  51. ('right','UMINUS'),
  52. )
  53.  
  54. # dictionary of names
  55. names = { }
  56.  
  57. def p_statement_assign(p):
  58. 'statement : NAME "=" expression'
  59. names[p[1]] = p[3]
  60.  
  61. def p_statement_expr(p):
  62. 'statement : expression'
  63. print p[1]
  64.  
  65. def p_expression_binop(p):
  66. '''expression : expression '+' expression
  67. | expression '-' expression
  68. | expression '*' expression
  69. | expression '/' expression'''
  70. if p[2] == '+' : p[0] = p[1] + p[3]
  71. elif p[2] == '-': p[0] = p[1] - p[3]
  72. elif p[2] == '*': p[0] = p[1] * p[3]
  73. elif p[2] == '/': p[0] = p[1] / p[3]
  74.  
  75. def p_expression_uminus(p):
  76. "expression : '-' expression %prec UMINUS"
  77. p[0] = -p[2]
  78.  
  79. def p_expression_group(p):
  80. "expression : '(' expression ')'"
  81. p[0] = p[2]
  82.  
  83. def p_expression_number(p):
  84. "expression : NUMBER"
  85. p[0] = p[1]
  86.  
  87. def p_expression_name(p):
  88. "expression : NAME"
  89. try:
  90. p[0] = names[p[1]]
  91. except LookupError:
  92. print "Undefined name '%s'" % p[1]
  93. p[0] = 0
  94.  
  95. def p_error(p):
  96. print "Syntax error at '%s'" % p.value
  97.  
  98. import ply.yacc as yacc
  99. yacc.yacc()
  100.  
  101. while 1:
  102. try:
  103. s = raw_input('calc > ')
  104. except EOFError:
  105. break
  106. if not s: continue
  107. yacc.parse(s)
  108.  
  109. your text goes here
Not running #stdin #stdout 0s 0KB
stdin
if(2/3 = 0)
print true
stdout
Standard output is empty