Sunteți pe pagina 1din 3

#

# Analizador lexico
#
import sys
import ply.lex as lex
import ply.yacc as yacc
sys.path.insert(0, "../..")
if sys.version_info[0] >= 3:
raw_input = input
class Node:
def __init__(self, name, children = None, leaf = None):
self.name = name
if children == None:
children = []
self.children = children
self.leaf = leaf
def __str__(self):
return "<%s>" % self.name
def __repr__(self):
return "<%s>" % self.name
tokens = (
'NAME',
'NUMBER',
)
literals = ['=','+','-','*','/','(',')']
t_NAME = r'[a-zA-Z_][a-zA-Z0-9_]*'
def t_NUMBER(t):
r'[0-9]+[.]?[0-9]*|[.][0-9]+'
t.value = float(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 "Caracter ilegal '%s'" % t.value[0]
t.lexer.skip(1)
lex.lex()
#
# Analizador Sintatico
#
precedence = (
('left', '+', '-'),
('left', '*', '/'),
('right', 'UMINUS'),
)
def p_sttm_assign(p):
"sttm : NAME '=' expr"
p[0] = Node('AssignNode', [p[1], p[3]])
def p_sttm_expr(p):
"sttm : expr"
p[0] = p[1]
def p_expr_binop(p):
'''expr : expr '+' expr
| expr '-' expr
| expr '*' expr
| expr '/' expr'''
if p[2] == '+' : p[0] = Node('AddNode', [p[1], p[3]])
elif p[2] == '-' : p[0] = Node('SubNode', [p[1], p[3]])
elif p[2] == '*' : p[0] = Node('MultNode', [p[1], p[3]])
elif p[2] == '/' : p[0] = Node('DivideNode', [p[1], p[3]])
def p_expr_uminus(p):
"expr : '-' expr %prec UMINUS"
p[0] = Node('UMinusNode', [p[2]])
def p_expr_group(p):
"expr : '(' expr ')'"
p[0] = p[2]
def p_expr_name(p):
"expr : NAME"
p[0] = Node('VarNode', [], p[1])
def p_expr_number(p):
"expr : NUMBER"
p[0] = Node('NumNode', [], p[1])
def p_error(p):
if p:
print "Error de Sintaxis en '%s'" % p.value
else:
print "Error de Sintaxis en EOF"
yacc.yacc(debug=1)
def dump_tree(node, ident = ""):
if not hasattr(node, "datatype"):
datatype = ""
else:
datatype = node.datatype
if not node.leaf:
print "%s%s %s" % (ident, node.name, datatype)
else:
print "%s%s (%s) %s" % (ident, node.name, node.leaf, datatype)
ident = ident.replace("-", " ")
ident = ident.replace("+", " ")
for i in range(len(node.children)):
c = node.children[i]
if i == len(node.children) - 1:
dump_tree(c, ident + " +-- ")
else:
dump_tree(c, ident + " |-- ")
while True:
try:
s = raw_input("calc >")
except EOFError:
break
if not s: continue
dump_tree(yacc.parse(s))

S-ar putea să vă placă și