def podaCabecalho(no): if (len(no.child[0].child) != 1): variavel = [] vet = [] noAux = no.child[0] while (True): if (noAux.value): variavel.append(noAux.value) for son in noAux.child: vet.append(son) if (len(vet) == 0): break noAux = vet.pop(0) no.child[0].child = [] tipo = [] num = [] for v in variavel: if (v != 'inteiro' and v != 'flutuante'): num.insert(0, v) # no.child[0].child.insert(0,Tree(v)) else: tipo.insert(0, v) for i in range(len(tipo)): no.child[0].child.insert(0, Tree( tipo[i], [Tree(num[i])], ))
def expressoes(no): if (no.child.__len__() == 3 and no.child[0].child.__len__() != 3): no.child.append(Tree(str(no.child[1].value), [])) var1 = encontraFolha(no.child[0]) var2 = encontraFolha(no.child[2]) no.child.pop(0) no.child.pop(0) no.child.pop(0) no.child[0].child.append(Tree(str(var1.value))) no.child[0].child.append(Tree(str(var2.value))) else: no.child.append(Tree(str(no.child[1].value), [])) var2 = encontraFolha(no.child[2]) var1 = no.child.pop(0) no.child.pop(0) no.child.pop(0) no.child[0].child.append(var1) no.child[0].child.append(Tree(str(var2.value)))
def p_lista_declaracoes(p): ''' lista_declaracoes : declaracao | lista_declaracoes declaracao ''' if len(p) == 3: p[0] = Tree('lista_declaracoes', [p[1], p[2]]) elif len(p) == 2: p[0] = Tree('lista_declaracoes', [p[1]])
def p_expressao_multiplicativa(p): ''' expressao_multiplicativa : expressao_unaria | expressao_multiplicativa operador_multiplicacao expressao_unaria ''' if len(p) == 2: p[0] = Tree('expressao_multiplicativa', [p[1]]) elif len(p) == 4: p[0] = Tree('expressao_multiplicativa', [p[1], p[2], p[3]])
def p_expressao_simples(p): ''' expressao_simples : expressao_aditiva | expressao_simples operador_relacional expressao_aditiva ''' if len(p) == 2: p[0] = Tree('expressao_simples', [p[1]]) elif len(p) == 4: p[0] = Tree('expressao_simples', [p[1], p[2], p[3]])
def p_lista_variaveis(p): ''' lista_variaveis : lista_variaveis VIRGULA var | var ''' if len(p) == 4: p[0] = Tree('lista_variaveis', [p[1], p[3]]) elif len(p) == 2: p[0] = Tree('lista_variaveis', [p[1]])
def p_se(p): ''' se : SE expressao ENTAO corpo FIM | SE expressao ENTAO corpo SENAO corpo FIM ''' if len(p) == 6: p[0] = Tree('se', [p[2], p[4]]) elif len(p) == 8: p[0] = Tree('se', [p[2], p[4], p[6]])
def p_expressao_logica(p): ''' expressao_logica : expressao_simples | expressao_logica operador_logico expressao_simples ''' if len(p) == 2: p[0] = Tree('expressao_logica', [p[1]]) elif len(p) == 4: p[0] = Tree('expressao_logica', [p[1], p[2], p[3]])
def p_corpo(p): ''' corpo : corpo acao | vazio ''' if len(p) == 3: p[0] = Tree('corpo', [p[1], p[2]]) elif len(p) == 2: p[0] = Tree('corpo', [p[1]])
def p_indice(p): ''' indice : indice ABRE_COL expressao FECHA_COL | ABRE_COL expressao FECHA_COL ''' if len(p) == 5: p[0] = Tree('indice', [p[1], p[3]]) elif len(p) == 4: p[0] = Tree('indice', [p[2]])
def p_parametro(p): ''' parametro : tipo DOIS_PONTOS ID | parametro ABRE_COL FECHA_COL ''' if (p[2] == ':'): p[0] = Tree('parametro', [p[1]], p[3]) else: p[0] = Tree('parametro', [p[1]])
def p_declaracao_funcao(p): ''' declaracao_funcao : tipo cabecalho | cabecalho ''' if len(p) == 3: p[0] = Tree('declaracao_funcao', [p[1], p[2]]) elif len(p) == 2: p[0] = Tree('declaracao_funcao', [p[1]])
def p_var(p): ''' var : ID | ID indice ''' if len(p) == 2: p[0] = Tree('var', [], p[1]) elif len(p) == 3: p[0] = Tree('var', [p[2]], p[1])
def p_expressao_aditiva(p): ''' expressao_aditiva : expressao_multiplicativa | expressao_aditiva operador_soma expressao_multiplicativa ''' if len(p) == 2: p[0] = Tree('expressao_aditiva', [p[1]]) elif len(p) == 4: p[0] = Tree('expressao_aditiva', [p[1], p[2], p[3]])
def p_lista_parametros(p): ''' lista_parametros : lista_parametros VIRGULA parametro | parametro | vazio ''' if len(p) == 4: p[0] = Tree('lista_parametros', [p[1], p[3]]) elif len(p) == 2: p[0] = Tree('lista_parametros', [p[1]])
def p_lista_argumentos(p): ''' lista_argumentos : lista_argumentos VIRGULA expressao | expressao | vazio ''' if len(p) == 4: p[0] = Tree('lista_argumentos', [p[1], p[3]]) elif len(p) == 2: p[0] = Tree('lista_argumentos', [p[1]])
def p_expressao_unaria(p): ''' expressao_unaria : fator | operador_soma fator | operador_negacao fator ''' if len(p) == 2: p[0] = Tree('expressao_unaria', [p[1]]) elif len(p) == 3: p[0] = Tree('expressao_unaria', [p[1], p[2]])
def p_fator(p): ''' fator : ABRE_PAR expressao FECHA_PAR | var | chamada_funcao | numero ''' if len(p) == 4: p[0] = Tree('fator', [p[2]]) elif len(p) == 2: p[0] = Tree('fator', [p[1]])
def p_declaracao(p): ''' declaracao : declaracao_variaveis | inicializacao_variaveis | declaracao_funcao ''' p[0] = Tree('declaracao', [p[1]])
def p_numero(p): ''' numero : NUM_INTEIRO | NUM_FLUTUANTE | NUM_NOTACAO_CIENTIFICA ''' p[0] = Tree('numero', [], p[1])
def podaRetorna(no): var = encontraFolha(no) if (var.type == 'numero'): no.child = [] no.child.append(Tree(str(var.value))) else: no.child = [] no.child.append(var)
def podaAcao(no): if (no.child[0].type == 'escreva' or no.child[0].type == 'leia'): var = encontraFolha(no.child[0]) no.child[0].child[0] = Tree(var.value) elif (no.child[0].type != 'retorna'): var = encontraFolha(no.child[0]) no.child[0] = var
def p_operador_relacional(p): ''' operador_relacional : MENOR | MAIOR | IGUALDADE | DIFERENCA | MENOR_IGUAL | MAIOR_IGUAL ''' p[0] = Tree('operador_relacional', [], p[1])
def podaDeclaracao_variaveis(no): var = pegaVariavel(no) qtdFilhos = no.child.__len__() if (no.child[1].child[0].child.__len__() != 0 and no.child[1].child[0].type != 'lista_variaveis'): filho = arrayFilho(var.__len__(), var) no.child[0] = Tree(var[0]) no.child[1] = Tree(var[1], filho) else: for i in range(var.__len__()): if (i < qtdFilhos): no.child[i] = Tree(str(var[i])) else: no.child.append(Tree(str(var[i])))
def p_acao(p): ''' acao : expressao | declaracao_variaveis | se | repita | leia | escreva | retorna | error ''' p[0] = Tree('acao', [p[1]])
def p_tipo(p): ''' tipo : INTEIRO | FLUTUANTE ''' p[0] = Tree('tipo', [], p[1])
def p_operador_logico(p): ''' operador_logico : E_LOGICO | OU_LOGICO ''' p[0] = Tree('operador_logico', [], p[1])
def p_chamada_funcao(p): ''' chamada_funcao : ID ABRE_PAR lista_argumentos FECHA_PAR ''' p[0] = Tree('chamada_funcao', [p[3]], p[1])
def p_inicializacao_variaveis(p): ''' inicializacao_variaveis : atribuicao ''' p[0] = Tree('inicializacao_variaveis', [p[1]])
def p_declaracao_variaveis(p): ''' declaracao_variaveis : tipo DOIS_PONTOS lista_variaveis ''' p[0] = Tree('declaracao_variaveis', [p[1], p[3]])