Guest User

Untitled

a guest
Dec 18th, 2017
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.93 KB | None | 0 0
  1. # -----------------------------------------------------------------------------
  2. # p.py
  3. #
  4. # A simple calculator with variables. This is from O'Reilly's
  5. # "Lex and Yacc", p. 63.
  6. # -----------------------------------------------------------------------------
  7.  
  8. import sys
  9. sys.path.insert(0, "../..")
  10.  
  11. if sys.version_info[0] >= 3:
  12. raw_input = input
  13.  
  14. contador = 0
  15.  
  16. tokens = (
  17. 'NAME', 'NUMBER',
  18. )
  19.  
  20. literals = ['=', '+', '-', '*', '/', '(', ')']
  21.  
  22. # Tokens
  23.  
  24. t_NAME = r'[a-zA-Z_][a-zA-Z0-9_]*'
  25.  
  26.  
  27. def t_NUMBER(t):
  28. r'\d+'
  29. t.value = int(t.value)
  30. return t
  31.  
  32. t_ignore = " \t"
  33.  
  34.  
  35. def t_newline(t):
  36. r'\n+'
  37. t.lexer.lineno += t.value.count("\n")
  38.  
  39.  
  40. def t_error(t):
  41. print("Illegal character '%s'" % t.value[0])
  42. t.lexer.skip(1)
  43.  
  44. # Build the lexer
  45. import ply.lex as lex
  46. lex.lex()
  47.  
  48. # Parsing rules
  49.  
  50. precedence = (
  51. ('left', '+', '-'),
  52. ('left', '*', '/'),
  53. ('right', 'UMINUS'),
  54. )
  55.  
  56. # dictionary of names
  57. names = { 'Z__X':'Zx',
  58. 'Z__A':'Za',
  59. 'Z__B':'Zb',
  60. 'Z__C':'Zc',
  61. 'V__ba':'Vba',
  62. 'V__cb':'Vcb',
  63. 'V__ca':'Vca',
  64. }
  65.  
  66.  
  67. def p_statement_assign(p):
  68. 'statement : NAME "=" expression'
  69. names[p[1]] = p[3]
  70.  
  71.  
  72. def p_statement_expr(p):
  73. 'statement : expression'
  74. print(p[1])
  75.  
  76.  
  77. def p_expression_binop(p):
  78. '''expression : expression '+' expression
  79. | expression '-' expression
  80. | expression '*' expression
  81. | expression '/' expression'''
  82.  
  83. global contador
  84.  
  85. if p[2] == '+':
  86. print "tmp[%s] = addComplex(%s, %s);" %(contador, p[1], p[3])
  87. p[0] = "tmp[%s]" %(contador)
  88. a="%s" %(p[1])
  89. if a[0:3] == "tmp":
  90. print "destroyComplex (%s);" %(p[1])
  91. b="%s" %(p[3])
  92. if b[0:3] == "tmp":
  93. print "destroyComplex (%s);" %(p[3])
  94. contador = contador + 1
  95. elif p[2] == '-':
  96. print "tmp[%s] = subComplex(%s, %s);" %(contador, p[1], p[3])
  97. p[0] = "tmp[%s]" %(contador)
  98. a="%s" %(p[1])
  99. if a[0:3] == "tmp":
  100. print "destroyComplex (%s);" %(p[1])
  101. b="%s" %(p[3])
  102. if b[0:3] == "tmp":
  103. print "destroyComplex (%s);" %(p[3])
  104. contador = contador + 1
  105. elif p[2] == '*':
  106. print "tmp[%s] = mulComplex(%s, %s);" %(contador, p[1], p[3])
  107. p[0] = "tmp[%s]" %(contador)
  108. a="%s" %(p[1])
  109. if a[0:3] == "tmp":
  110. print "destroyComplex (%s);" %(p[1])
  111. b="%s" %(p[3])
  112. if b[0:3] == "tmp":
  113. print "destroyComplex (%s);" %(p[3])
  114. contador = contador + 1
  115. elif p[2] == '/':
  116. print "tmp[%s] = divComplex(%s, %s);" %(contador, p[1], p[3])
  117. p[0] = "tmp[%s]" %(contador)
  118. a="%s" %(p[1])
  119. if a[0:3] == "tmp":
  120. print "destroyComplex (%s);" %(p[1])
  121. b="%s" %(p[3])
  122. if b[0:3] == "tmp":
  123. print "destroyComplex (%s);" %(p[3])
  124. contador = contador + 1
  125.  
  126.  
  127. def p_expression_uminus(p):
  128. "expression : '-' expression %prec UMINUS"
  129. global contador
  130. print "tmp[%s] = negComplex(%s);" %(contador, p[2])
  131. p[0] = "tmp[%s]" %(contador)
  132. a="%s" %(p[2])
  133. if a[0:3] == "tmp":
  134. print "destroyComplex (%s);" %(p[2])
  135. contador = contador + 1
  136.  
  137.  
  138. def p_expression_group(p):
  139. "expression : '(' expression ')'"
  140. p[0] = p[2]
  141.  
  142.  
  143. def p_expression_number(p):
  144. "expression : NUMBER"
  145. global contador
  146. print "tmp[%s] = createComplex__mag_angle(%s, 0);" %(contador, p[1])
  147. p[0] = "tmp[%s]" %(contador)
  148. contador = contador + 1
  149.  
  150.  
  151. def p_expression_name(p):
  152. "expression : NAME"
  153. try:
  154. p[0] = names[p[1]]
  155. except LookupError:
  156. print("Undefined name '%s'" % p[1])
  157. p[0] = 0
  158.  
  159.  
  160. def p_error(p):
  161. if p:
  162. print("Syntax error at '%s'" % p.value)
  163. else:
  164. print("Syntax error at EOF")
  165.  
  166. import ply.yacc as yacc
  167. yacc.yacc()
  168.  
  169. while 1:
  170. try:
  171. s = raw_input('calc > ')
  172. except EOFError:
  173. break
  174. if not s:
  175. continue
  176. yacc.parse(s) 
Add Comment
Please, Sign In to add comment