def p_operador_negacao(p): """operador_negacao : NEGACAO""" pai = MyNode(name='operador_negacao', type='OPERADOR_NEGACAO') nao = MyNode(name='NEGACAO', type='NEGACAO', parent=pai) nao_simbolo = MyNode(name=p[1], type='SIMBOLO', parent=nao) p[1] = nao
def p_fator(p): """fator : ABRE_PARENTESE expressao FECHA_PARENTESE | var | chamada_funcao | numero """ pai = MyNode(name='fator', type="FATOR") p[0] = pai if len(p) > 2: abre_parentese = MyNode(name='ABRE_PARENTESE', type='ABRE_PARENTESE', parent=pai) abre_parentese_simbolo = MyNode(name='(', type='SIMBOLO', parent=abre_parentese) p[1] = abre_parentese p[2].parent = pai fecha_parentese = MyNode(name='FECHA_PARENTESE', type='FECHA_PARENTESE', parent=pai) fecha_parentese_simbolo = MyNode(name=')', type='SIMBOLO', parent=fecha_parentese) p[3] = fecha_parentese else: p[1].parent = pai
def resolve_expressao_aditiva(exp, tipo_var, id_atrib): filho = exp.children[0] if filho.label == 'expressao_multiplicativa': return resolve_expressao_multiplicativa(filho, tipo_var, id_atrib) else: filho_esq = exp.children[0] filho_dir = exp.children[2] a1 = resolve_expressao_aditiva(filho_esq, tipo_var, id_atrib) a3 = resolve_expressao_multiplicativa(filho_dir, tipo_var, id_atrib) tipo_a1 = a1.type tipo_a3 = a3.type if tipo_a3 == tipo_a1: tipo_operacao = tipo_a3 else: tipo_operacao = "FLUTUANTE" nome_operador = exp.children[1].children[0].label if nome_operador == "MAIS": node_adicao = MyNode(name="+", type=tipo_operacao) elif nome_operador == "MENOS": node_adicao = MyNode(name="-", type=tipo_operacao) a1.parent = node_adicao a3.parent = node_adicao node_adicao.id = "+-" + tipo_operacao return node_adicao
def p_operador_negacao(p): """operador_negacao : NEGACAO""" if p[1] == "!": filho = MyNode(name='NEGACAO', type='NEGACAO') negacao_lexema = MyNode(name=p[1], type='SIMBOLO', parent=filho) p[0] = MyNode(name='operador_negacao', type='OPERADOR_NEGACAO', children=[filho])
def p_operador_negacao(p): """operador_negacao : NAO""" if p[1] == "!": child = MyNode(name="NAO", type="NAO") negacao_lexema = MyNode(name=p[1], line=p.lineno(1), type="SIMBOLO", parent=child) p[0] = MyNode( name="operador_negacao", type="OPERADOR_NEGACAO", children=[child] )
def p_cabecalho(p): """cabecalho : ID ABRE_PARENTESE lista_parametros FECHA_PARENTESE corpo FIM""" father = MyNode(name="cabecalho", type="CABECALHO") p[0] = father child1 = MyNode(name="ID", type="ID", parent=father) child_id = MyNode(name=p[1], line=p.lineno(1), type="ID", parent=child1) p[1] = child1 child2 = MyNode(name="ABRE_PARENTESE", type="ABRE_PARENTESE", parent=father) child_sym2 = MyNode(name="(", type="SIMBOLO", parent=child2) p[2] = child2 p[3].parent = father child4 = MyNode(name="FECHA_PARENTESE", type="FECHA_PARENTESE", parent=father) child_sym4 = MyNode(name=")", type="SIMBOLO", parent=child4) p[4] = child4 p[5].parent = father child6 = MyNode(name="FIM", type="FIM", parent=father) child_id = MyNode(name="fim", type="FIM", parent=child6) p[6] = child6
def p_indice(p): """indice : indice ABRE_COLCHETE expressao FECHA_COLCHETE | ABRE_COLCHETE expressao FECHA_COLCHETE """ father = MyNode(name="indice", type="INDICE") p[0] = father if len(p) == 5: p[1].parent = father child2 = MyNode(name="abre_colchete", type="ABRE_COLCHETE", parent=father) child_sym2 = MyNode(name=p[2], line=p.lineno(2), type="SIMBOLO", parent=child2) p[2] = child2 p[3].parent = father child4 = MyNode(name="fecha_colchete", type="FECHA_COLCHETE", parent=father) child_sym4 = MyNode(name=p[4], line=p.lineno(4), type="SIMBOLO", parent=child4) p[4] = child4 else: child1 = MyNode(name="abre_colchete", type="ABRE_COLCHETE", parent=father) child_sym1 = MyNode(name=p[1], line=p.lineno(1), type="SIMBOLO", parent=child1) p[1] = child1 p[2].parent = father child3 = MyNode(name="fecha_colchete", type="FECHA_COLCHETE", parent=father) child_sym3 = MyNode(name=p[3], line=p.lineno(3), type="SIMBOLO", parent=child3) p[3] = child3
def main(search_name): ## Searches for the node named search_name in the instantiated MyTree object using ## MyTree function find_node. Prints information about the node if found, ## as well as names of nodes visited during the search. ## Instantiate nodes e1 = MyNode("E1", []) find_me = MyNode("FindMe", []) c1 = MyNode("C1", []) d1 = MyNode("D1", [e1]) b1 = MyNode("B1", [find_me]) b2 = MyNode("B2", [c1]) a1 = MyNode("A1", [d1]) a2 = MyNode("A2", [b1, b2]) start = MyNode("Start", [a1, a2]) ## Instatiate tree tree_nodes = [start, a1, a2, d1, b1, b2, e1, find_me, c1] my_tree = MyTree(start, tree_nodes) ## Find the node named search_name target_node = my_tree.find_node(search_name) ## If found, return node. Otherwise return null. ## In either case, print result. if target_node: print("\nThe node named " + search_name + " was found.") print(target_node) else: print("\nNo node named " + search_name + " was found.")
def p_parametro(p): """parametro : tipo DOIS_PONTOS ID | parametro ABRE_COLCHETE FECHA_COLCHETE """ pai = MyNode(name='parametro', type='PARAMETRO') p[0] = pai p[1].parent = pai if p[2] == ':': dois_pontos = MyNode(name="dois_pontos", type='DOIS_PONTOS', parent=pai) dois_pontos_simbolo = MyNode(name=":", type='SIMBOLO', parent=dois_pontos) p[2] = dois_pontos node_id = MyNode(name='id', type='ID', parent=pai) filho_id = MyNode(name=p[3], type='ID', parent=node_id) p[3] = dois_pontos else: abre_colchete = MyNode(name='abre_colchete', type='ABRE_COLCHETE', parent=pai) abre_colchete_simbolo = MyNode(name='[', type='SIMBOLO', parent=abre_colchete) p[2] = abre_colchete fecha_colchete = MyNode(name='fecha_colchete', type='FECHA_COLCHETE', parent=pai) fecha_colchete_simbolo = MyNode(name=']', type='SIMBOLO', parent=fecha_colchete) p[2] = fecha_colchete
def p_indice(p): """indice : indice ABRE_COLCHETE expressao FECHA_COLCHETE | ABRE_COLCHETE expressao FECHA_COLCHETE """ pai = MyNode(name='indice', type='INDICE') p[0] = pai if len(p) == 5: p[1].parent = pai # indice filho2 = MyNode(name='abre_colchete', type='ABRE_COLCHETE', parent=pai) filho_sym2 = MyNode(name=p[2], type='SIMBOLO', parent=filho2) p[2] = filho2 p[3].parent = pai # expressao filho4 = MyNode(name='fecha_colchete', type='FECHA_COLCHETE', parent=pai) filho_sym4 = MyNode(name=p[4], type='SIMBOLO', parent=filho4) p[4] = filho4 else: filho1 = MyNode(name='abre_colchete', type='ABRE_COLCHETE', parent=pai) filho_sym1 = MyNode(name=p[1], type='SIMBOLO', parent=filho1) p[1] = filho1 p[2].parent = pai # expressao filho3 = MyNode(name='fecha_colchete', type='FECHA_COLCHETE', parent=pai) filho_sym3 = MyNode(name=p[3], type='SIMBOLO', parent=filho3) p[3] = filho3
def p_cabecalho(p): """cabecalho : ID ABRE_PARENTESE lista_parametros FECHA_PARENTESE corpo FIM""" pai = MyNode(name='cabecalho', type='CABECALHO') p[0] = pai filho1 = MyNode(name='ID', type='ID', parent=pai) filho_id = MyNode(name=p[1], type='ID', parent=filho1) p[1] = filho1 filho2 = MyNode(name='ABRE_PARENTESE', type='ABRE_PARENTESE', parent=pai) filho_sym2 = MyNode(name='(', type='SIMBOLO', parent=filho2) p[2] = filho2 p[3].parent = pai # lista_parametros filho4 = MyNode(name='FECHA_PARENTESE', type='FECHA_PARENTESE', parent=pai) filho_sym4 = MyNode(name=')', type='SIMBOLO', parent=filho4) p[4] = filho4 p[5].parent = pai # corpo filho6 = MyNode(name='FIM', type='FIM', parent=pai) filho_id = MyNode(name='fim', type='FIM', parent=filho6) p[6] = filho6
def p_cabecalho(p): """cabecalho : ID ABRE_PARENTESE lista_parametros FECHA_PARENTESE corpo FIM""" pai = MyNode(name='cabecalho', type='CABECALHO') p[0] = pai node_id = MyNode(name="ID", type='ID', parent=pai) node_id_simbolo = MyNode(name=p[1], type='ID', parent=node_id) p[1] = node_id abre_parentese = MyNode(name='ABRE_PARENTESE', type='ABRE_PARENTESE', parent=pai) abre_parentese_simbolo = MyNode(name='(', type='SIMBOLO', parent=abre_parentese) p[2] = abre_parentese p[3].parent = pai fecha_parentese = MyNode(name='FECHA_PARENTESE', type='FECHA_PARENTESE', parent=pai) fecha_parentese_simbolo = MyNode(name=")", type='SIMBOLO', parent=fecha_parentese) p[4] = fecha_parentese p[5].parent = pai fim = MyNode(name='FIM', type='FIM', parent=pai) fim_simbolo = MyNode(name='fim', type='FIM', parent=fim) p[6] = fim
def p_declaracao_variaveis(p): """declaracao_variaveis : tipo DOIS_PONTOS lista_variaveis""" pai = MyNode(name='declaracao_variaveis', type='DECLARACAO_VARIAVEIS') p[0] = pai p[1].parent = pai dois_pontos = MyNode(name='dois_pontos', type='DOIS_PONTOS', parent=pai) dois_pontos_simbolo = MyNode(name=p[2], type='SIMBOLO', parent=dois_pontos) p[2] = dois_pontos p[3].parent = pai
def p_atribuicao(p): """atribuicao : var ATRIBUICAO expressao""" pai = MyNode(name='atribuicao', type='ATRIBUICAO') p[0] = pai p[1].parent = pai atribuicao = MyNode(name='ATRIBUICAO', type='ATRIBUICAO', parent=pai) atribuicao_simbolo = MyNode(name=':=', type='SIMBOLO', parent=atribuicao) p[2] = atribuicao p[3].parent = pai
def p_var(p): """var : ID | ID indice """ pai = MyNode(name='var', type='VAR') p[0] = pai filho = MyNode(name='ID', type='ID', parent=pai) filho_id = MyNode(name=p[1], type='ID', parent=filho) p[1] = filho if len(p) > 2: p[2].parent = pai
def p_var(p): """var : ID | ID indice """ father = MyNode(name="var", type="VAR") p[0] = father child = MyNode(name="ID", type="ID", parent=father) child_id = MyNode(name=p[1], line=p.lineno(1), type="ID", parent=child) p[1] = child if len(p) > 2: p[2].parent = father
def p_var(p): """var : ID | ID indice""" pai = MyNode(name='var', type='VAR') p[0] = pai node_id = MyNode(name='ID', type='ID', parent=pai) node_id_simbolo = MyNode(name=p[1], type='SIMBOLO', parent=node_id) p[1] = node_id if len(p) > 2: p[2].parent = pai
def p_declaracao_variaveis(p): """declaracao_variaveis : tipo DOIS_PONTOS lista_variaveis""" father = MyNode(name="declaracao_variaveis", type="DECLARACAO_VARIAVEIS") p[0] = father p[1].parent = father child = MyNode(name="dois_pontos", type="DOIS_PONTOS", parent=father) child_sym = MyNode(name=p[2], line=p.lineno(2), type="SIMBOLO", parent=child) p[2] = child p[3].parent = father
def p_declaracao_variaveis(p): """declaracao_variaveis : tipo DOIS_PONTOS lista_variaveis""" pai = MyNode(name='declaracao_variaveis', type='DECLARACAO_VARIAVEIS') p[0] = pai p[1].parent = pai filho = MyNode(name='dois_pontos', type='DOIS_PONTOS', parent=pai) filho_sym = MyNode(name=p[2], type='SIMBOLO', parent=filho) p[2] = filho p[3].parent = pai
def p_atribuicao(p): """atribuicao : var ATRIBUICAO expressao""" pai = MyNode(name='atribuicao', type='ATRIBUICAO') p[0] = pai p[1].parent = pai filho2 = MyNode(name='ATRIBUICAO', type='ATRIBUICAO', parent=pai) filho_sym2 = MyNode(name=':=', type='SIMBOLO', parent=filho2) p[2] = filho2 p[3].parent = pai
def p_lista_variaveis(p): """lista_variaveis : lista_variaveis VIRGULA var | var """ pai = MyNode(name='lista_variaveis', type='LISTA_VARIAVEIS') p[0] = pai if len(p) > 2: p[1].parent = pai filho = MyNode(name='virgula', type='VIRGULA', parent=pai) filho_sym = MyNode(name=',', type='SIMBOLO', parent=filho) p[3].parent = pai else: p[1].parent = pai
def p_operador_multiplicacao(p): """operador_multiplicacao : MULTIPLICACAO | DIVISAO """ pai = MyNode(name='operador_multiplicacao', type='OPERADOR_MULTIPLICACAO') p[0] = pai if (p[1] == '*'): node = MyNode(name='MULTIPLICACAO', type='MULTIPLICACAO', parent=pai) else: node = MyNode(name='DIVISAO', type='DIVISAO', parent=pai) node_simbolo = MyNode(name=p[1], type='SIMBOLO', parent=node) p[1] = node
def p_lista_variaveis(p): """lista_variaveis : lista_variaveis VIRGULA var | var """ father = MyNode(name="lista_variaveis", type="LISTA_VARIAVEIS") p[0] = father if len(p) > 2: p[1].parent = father child = MyNode(name="virgula", type="VIRGULA", parent=father) child_sym = MyNode(name=",", type="SIMBOLO", parent=child) p[3].parent = father else: p[1].parent = father
def p_atribuicao(p): """atribuicao : var ATRIBUICAO expressao""" father = MyNode(name="atribuicao", type="ATRIBUICAO") p[0] = father p[1].parent = father child2 = MyNode(name="ATRIBUICAO", type="ATRIBUICAO", parent=father) child_sym2 = MyNode(name=":=", type="SIMBOLO", parent=child2) p[2] = child2 p[3].parent = father
def p_operador_logico(p): """operador_logico : E_LOGICO | OU_LOGICO """ pai = MyNode(name='operador_logico', type='OPERADOR_LOGICO') p[0] = pai if p[1] == "E": node = MyNode(name='E_LOGICO', type='E_LOGICO', parent=pai) else: node = MyNode(name="OU_LOGICO", type='OU_LOGICO', parent=pai) node_simbolo = MyNode(name=p[1], type='SIMBOLO', parent=node) p[1] = node
def p_lista_variaveis(p): """lista_variaveis : lista_variaveis VIRGULA var | var """ pai = MyNode(name='lista_variaveis', type='LISTA_VARIAVEIS') p[0] = pai p[1].parent = pai if len(p) > 2: virgula = MyNode(name='virgula', type='VIRGULA', parent=pai) virgula_simbolo = MyNode(name=',', type='simbolo', parent=virgula) p[2] = virgula p[3].parent = pai
def p_lista_parametros(p): """lista_parametros : lista_parametros VIRGULA parametro | parametro | vazio """ pai = MyNode(name='lista_parametros', type='LISTA_PARAMETROS') p[0] = pai p[1].parent = pai if len(p) > 2: filho2 = MyNode(name='virgula', type='VIRGULA', parent=pai) filho_sym2 = MyNode(name=',', type='SIMBOLO', parent=filho2) p[2] = filho2 p[3].parent = pai
def p_lista_parametros(p): """lista_parametros : lista_parametros VIRGULA parametro | parametro | vazio """ father = MyNode(name="lista_parametros", type="LISTA_PARAMETROS") p[0] = father p[1].parent = father if len(p) > 2: child2 = MyNode(name="virgula", type="VIRGULA", parent=father) child_sym2 = MyNode(name=",", type="SIMBOLO", parent=child2) p[2] = child2 p[3].parent = father
def p_operador_soma(p): """operador_soma : MAIS | MENOS """ pai = MyNode(name='operador_soma', type='OPERADOR_SOMA') p[0] = pai if p[1] == "+": mais = MyNode(name='MAIS', type='MAIS', parent=pai) mais_simbolo = MyNode(name='+', type='SIMBOLO', parent=mais) p[1] = mais else: menos = MyNode(name='MENOS', type='MENOS', parent=pai) menos_simbolo = MyNode(name='-', type='SIMBOLO', parent=menos) p[1] = menos
def p_tipo(p): """tipo : INTEIRO | FLUTUANTE """ pai = MyNode(name='tipo', type='TIPO') p[0] = pai if p[1] == "inteiro": filho1 = MyNode(name='INTEIRO', type='INTEIRO', parent=pai) filho_sym = MyNode(name=p[1], type=p[1].upper(), parent=filho1) p[1] = filho1 else: filho1 = MyNode(name='FLUTUANTE', type='FLUTUANTE', parent=pai) filho_sym = MyNode(name=p[1], type=p[1].upper(), parent=filho1)