diff --git a/analisador_sintatico_expressao_aritmetica.py b/analisador_sintatico_expressao_aritmetica.py index 071f589..c24cce6 100644 --- a/analisador_sintatico_expressao_aritmetica.py +++ b/analisador_sintatico_expressao_aritmetica.py @@ -14,27 +14,33 @@ class Sintatico(object): def __init__(self): self.tokens = [] self.elemento = ["NUM", "ID", "Literal"] + self.tipo = ["int", "float", "char"] + self.pos_global = -1 def E(self, simb, lista, pos): + """Pertence a expressao arimética""" # print simb if(simb in self.elemento or simb == "("): - self.T(simb, lista, pos) - self.Elinha(simb, lista, pos) + return self.T(simb, lista, pos) + return self.Elinha(simb, lista, pos) else: - print "Erro Caracter Posicao ", pos, simb - return 0 + print "Erro Caracter Posição ", pos, simb + self.valida_expressao(simb, lista, pos) + return pos + return pos def T(self, simb, lista, pos): if(simb in self.elemento or simb == "("): - self.F(simb, lista, pos) - self.Tlinha(simb, lista, pos) + return self.F(simb, lista, pos) + return self.Tlinha(simb, lista, pos) else: - #Elinha(simb, lista, pos) + # Elinha(simb, lista, pos) # print "simboloT ", simb, pos - print "Erro Caracter Posicao ", pos, simb - return 0 + print "Erro Caracter Posicao ", pos, simb + return "T" + return pos def F(self, simb, lista, pos): @@ -43,25 +49,39 @@ def F(self, simb, lista, pos): retorno = self.get_next_token(lista, pos) simb = retorno[0] pos = retorno[1] - self.E(simb, lista, pos) + return self.E(simb, lista, pos) if(simb != ")"): - print "Erro Caracter Posicao ", pos + # print "Erro Caracter Posicao F ", pos exit() elif(simb in self.elemento): retorno = self.get_next_token(lista, pos) simb = retorno[0] pos = retorno[1] - self.Elinha(simb, lista, pos) + return self.Elinha(simb, lista, pos) else: print "Erro Caracter Posicao ", pos, simb exit() + return pos def get_next_token(self, lista, pos): """Puxa o proximo token""" + """Retorna o elemento e a sua posicao""" pos += 1 # print lista[pos] - return lista[pos], pos + try: + return lista[pos], pos + except Exception as e: + print "Erro Caracter", lista[pos - 1], "Posicao ", pos + print "Estouro da pilha de Recursão ..."\ + "Último simbolo válido", lista[pos - 1] + exit() + + def valida_expressao(self, simb, lista, pos): + """Válida expressões que não são ariméticas.""" + if(simb not in self.elemento): + print "Erro Caracter Posicao ", pos, simb + return simb, pos def Elinha(self, simb, lista, pos): """Válida adição e subtração.""" @@ -69,20 +89,23 @@ def Elinha(self, simb, lista, pos): retorno = self.get_next_token(lista, pos) simb = retorno[0] pos = retorno[1] - self.T(simb, lista, pos) - #Elinha(simb, lista, pos) - elif (simb == ")" or simb == "$"): - print "Válido" + return self.T(simb, lista, pos) + # Elinha(simb, lista, pos) + elif (simb == ")" or simb == ";"): + print "Expressão Válida" + return pos + elif (simb == "-"): retorno = self.get_next_token(lista, pos) simb = retorno[0] pos = retorno[1] # print "simbolo2 ", simb, pos - self.T(simb, lista, pos) + return self.T(simb, lista, pos) else: - self.Tlinha(simb, lista, pos) + return self.Tlinha(simb, lista, pos) # return 0 # print "Invalido" + return pos def Tlinha(self, simb, lista, pos): """Válida multiplicação""" @@ -92,31 +115,80 @@ def Tlinha(self, simb, lista, pos): simb = retorno[0] pos = retorno[1] # print "simbolo2 ", simb, pos - self.F(simb, lista, pos) - self.Tlinha(simb, lista, pos) + return self.F(simb, lista, pos) + return self.Tlinha(simb, lista, pos) elif(simb == "/"): retorno = self.get_next_token(lista, pos) simb = retorno[0] pos = retorno[1] - self.F(simb, lista, pos) - elif (simb == ")" or simb == "$"): - print "Válido" + return self.F(simb, lista, pos) + elif (simb == ")" or simb == ";"): + print "Expressão Válida" else: - return 0 + if(simb not in self.elemento): + print "Erro Caracter Posicao ", pos, simb + + return pos + + def programa(self): + """Função programa""" + retorno = self.get_next_token(self.tokens, self.pos_global) + simb = retorno[0] + pos = retorno[1] + print "First PROG ", simb + if(simb is "$"): + """Final da leitura""" + print "Leitura Completa - Válido" + if(simb in self.tipo): + self.declaracao(pos) + elif ("ID" in simb): + """Válida uma Atribuição""" + ret_pos = self.atribuicao(pos) + retorno = self.get_next_token(self.tokens, ret_pos) + simb = retorno[0] + pos = retorno[1] + if(simb is not ";"): + print "Erro Faltando ; Posição", simb, pos + elif(simb is "$"): + print "leitura completa - valido" + self.pos_global = pos + self.programa() + elif ("while" in simb): + pass + elif ("if" in simb): + pass + + def atribuicao(self, pos): + """Válida uma atribuicao""" + simb = self.tokens[pos] + if("ID" in simb): + retorno = self.get_next_token(self.tokens, pos) + simb = retorno[0] + pos = retorno[1] + if("=" in simb): + retorno = self.get_next_token(self.tokens, pos) + simb = retorno[0] + pos = retorno[1] + return self.E(simb, self.tokens, pos) + + def declaracao(self, pos): + print "Declaracao " + pass def conector(self, lista): - """Realiza a ponte de conexão entre o Analisador Lexico e o Sintatico""" - print "Entrada Sintatico ", lista + """Realiza a ponte de conexão entre o Analisador Lexico e o Sintático""" + print "Entrada Sintático ", lista + cont = 0 for i in lista: - # print i - if(i[0] is "NUM" or i[0] is "Literal" or i[0] is "ID"): + cont = cont + 1 + if(i[0] is "NUM" or i[0] is "Literal" or i[0] in " ID "): self.tokens.append(i[0]) + elif("Res" in i[0]): + self.tokens.append(i[1]) + print self.tokens else: self.tokens.append(i[0]) + self.tokens.append("$") print self.tokens - self.E(self.tokens[0], self.tokens, 0) - -# if __name__ == '__main__': -# sin = Sintatico() -# -# sin.E(tokens[0], tokens, 0) + self.programa() + # self.E(self.tokens[0], self.tokens, 0) diff --git a/analisador_sintatico_expressao_aritmetica.pyc b/analisador_sintatico_expressao_aritmetica.pyc index 626c450..2815109 100644 Binary files a/analisador_sintatico_expressao_aritmetica.pyc and b/analisador_sintatico_expressao_aritmetica.pyc differ diff --git a/anlex.py b/anlex.py index 289d0d8..89b8001 100644 --- a/anlex.py +++ b/anlex.py @@ -8,7 +8,6 @@ import sys import re from analisador_sintatico_expressao_aritmetica import Sintatico - token = "" numerico = "" estado = 0 diff --git a/tabela_simbolos_simp b/tabela_simbolos_simp index cb8dd55..fcd249c 100644 --- a/tabela_simbolos_simp +++ b/tabela_simbolos_simp @@ -1,5 +1,3 @@ Tabela de Simbolos -Chave:3 ['ID ', 'a', 'L:2 C:(1,2)'] -Chave:6 ['NUM', '3', 'L:2 C:(4,5)'] -Chave:8 ['NUM', '5', 'L:2 C:(6,7)'] -Chave:15 ['ID ', 'alpha', 'L:2 C:(9,14)'] +Chave:5 ['Res Cod: 1', 'int', 'L:2 C:(1,4)'] +Chave:7 ['ID ', 'a', 'L:2 C:(5,6)'] diff --git a/teste.c b/teste.c index 17cd371..b5f6bd5 100644 --- a/teste.c +++ b/teste.c @@ -1,2 +1,2 @@ // int -a=(3+5)*alpha +int a; diff --git a/teste2.c b/teste2.c index 017f5b1..ea637cc 100644 --- a/teste2.c +++ b/teste2.c @@ -5,7 +5,8 @@ Arquivo de teste */ int main() { - int a =8; - printf("%d",a/2); + int INT=8,IF=0; + printf("%d",INT+IF); + printf("%d",INT/2); return 0; }