From 59d7d43f4224ea854179d9081829e9c61cc64593 Mon Sep 17 00:00:00 2001 From: Exterminus Date: Wed, 14 Jun 2017 21:20:32 -0300 Subject: [PATCH] analisador sintatico --- analisador_sintatico_expressao_aritmetica.py | 216 ++++++++++-------- analisador_sintatico_expressao_aritmetica.pyc | Bin 0 -> 3799 bytes anlex.py | 44 ++-- lista_erros | 3 +- tabela_simbolos_simp | 25 +- teste.c | 2 +- token_saida | 50 +--- 7 files changed, 149 insertions(+), 191 deletions(-) create mode 100644 analisador_sintatico_expressao_aritmetica.pyc diff --git a/analisador_sintatico_expressao_aritmetica.py b/analisador_sintatico_expressao_aritmetica.py index 2e06358..071f589 100644 --- a/analisador_sintatico_expressao_aritmetica.py +++ b/analisador_sintatico_expressao_aritmetica.py @@ -2,105 +2,121 @@ """ Analisador Sintático Carlos Magno - """ -tokens = "(a-a+a//a)" - - -def E(simb, lista, pos): - # print simb - if(simb == 'a' or simb == "("): - T(simb, lista, pos) - Elinha(simb, lista, pos) - else: - print "Erro Caracter Posicao ", pos, simb - exit() - - -def T(simb, lista, pos): - - if(simb == "a" or simb == "("): - - F(simb, lista, pos) - Tlinha(simb, lista, pos) - else: - #Elinha(simb, lista, pos) - # print "simboloT ", simb, pos - print "Erro Caracter Posicao ", pos, simb - return 0 - - -def F(simb, lista, pos): - - if(simb == "("): - - retorno = get_next_token(lista, pos) - simb = retorno[0] - pos = retorno[1] - E(simb, lista, pos) - if(simb != ")"): - print "Erro Caracter Posicao ", pos +# tokens = ["(", "a", "+", "a", ")", "$"] + +# NUM LITERAL ID + + +class Sintatico(object): + """docstring for Sintatico.""" + + def __init__(self): + self.tokens = [] + self.elemento = ["NUM", "ID", "Literal"] + + def E(self, simb, lista, pos): + # print simb + if(simb in self.elemento or simb == "("): + self.T(simb, lista, pos) + self.Elinha(simb, lista, pos) + else: + print "Erro Caracter Posicao ", pos, simb + return 0 + + def T(self, simb, lista, pos): + + if(simb in self.elemento or simb == "("): + + self.F(simb, lista, pos) + self.Tlinha(simb, lista, pos) + else: + #Elinha(simb, lista, pos) + # print "simboloT ", simb, pos + print "Erro Caracter Posicao ", pos, simb + return 0 + + def F(self, simb, lista, pos): + + if(simb == "("): + + retorno = self.get_next_token(lista, pos) + simb = retorno[0] + pos = retorno[1] + self.E(simb, lista, pos) + if(simb != ")"): + print "Erro Caracter Posicao ", 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) + + else: + print "Erro Caracter Posicao ", pos, simb exit() - elif(simb == "a"): - retorno = get_next_token(lista, pos) - simb = retorno[0] - pos = retorno[1] - Elinha(simb, lista, pos) - - else: - print "Erro Caracter Posicao ", pos, simb - exit() - - -def get_next_token(lista, pos): - """Puxa o proximo token""" - pos += 1 - return lista[pos], pos - - -def Elinha(simb, lista, pos): - """Válida adição e subtração.""" - if(simb == "+"): - retorno = get_next_token(lista, pos) - simb = retorno[0] - pos = retorno[1] - # print "simbolo2 ", simb, pos - T(simb, lista, pos) - #Elinha(simb, lista, pos) - elif (simb == ")" or simb == "$"): - print "Válido" - elif (simb == "-"): - retorno = get_next_token(lista, pos) - simb = retorno[0] - pos = retorno[1] - # print "simbolo2 ", simb, pos - T(simb, lista, pos) - else: - Tlinha(simb, lista, pos) - # return 0 - # print "Invalido" - exit() - - -def Tlinha(simb, lista, pos): - """Válida multiplicação""" - # print"Elinha ", simb, pos - if(simb == "*"): - retorno = get_next_token(lista, pos) - simb = retorno[0] - pos = retorno[1] - # print "simbolo2 ", simb, pos - F(simb, lista, pos) - Tlinha(simb, lista, pos) - elif(simb == "/"): - retorno = get_next_token(lista, pos) - simb = retorno[0] - pos = retorno[1] - F(simb, lista, pos) - elif (simb == ")" or simb == "$"): - print "Válido" - else: - return 0 - exit() - -E(tokens[0], tokens, 0) + + def get_next_token(self, lista, pos): + """Puxa o proximo token""" + pos += 1 + # print lista[pos] + return lista[pos], pos + + def Elinha(self, simb, lista, pos): + """Válida adição e subtração.""" + if(simb == "+"): + 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" + elif (simb == "-"): + retorno = self.get_next_token(lista, pos) + simb = retorno[0] + pos = retorno[1] + # print "simbolo2 ", simb, pos + self.T(simb, lista, pos) + else: + self.Tlinha(simb, lista, pos) + # return 0 + # print "Invalido" + + def Tlinha(self, simb, lista, pos): + """Válida multiplicação""" + # print"Elinha ", simb, pos + if(simb == "*"): + retorno = self.get_next_token(lista, pos) + simb = retorno[0] + pos = retorno[1] + # print "simbolo2 ", simb, pos + self.F(simb, lista, pos) + 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" + else: + return 0 + + def conector(self, lista): + """Realiza a ponte de conexão entre o Analisador Lexico e o Sintatico""" + print "Entrada Sintatico ", lista + for i in lista: + # print i + if(i[0] is "NUM" or i[0] is "Literal" or i[0] is "ID"): + self.tokens.append(i[0]) + else: + self.tokens.append(i[0]) + print self.tokens + self.E(self.tokens[0], self.tokens, 0) + +# if __name__ == '__main__': +# sin = Sintatico() +# +# sin.E(tokens[0], tokens, 0) diff --git a/analisador_sintatico_expressao_aritmetica.pyc b/analisador_sintatico_expressao_aritmetica.pyc new file mode 100644 index 0000000000000000000000000000000000000000..626c45006e4c0ab14fed170adc1c9ba4bb872e18 GIT binary patch literal 3799 zcmd5<-*4PR5FYz3m%AgOKN6CLRN#k593T?jc&QL=lO{-QR5_(pf-2+Kn~QTk@8R8u z1CpokcOX@L;1%)8W27R%3;zrM0N;##cWKmCN)ZRS?09y)_Uz7l^Ub>Q*K~9K&zsv3 zm46jnKSMJfL`<{;>5y`0&!O0*ABawfws%~LE40 zo)Be{;+iORiYG;BP+S+KN&Z%gEt_i)v5t(*ldSFSl`ECSEJwTwZoL27Xy#prHqjAL zATGe>VZL3F5m{of{Y}e{Y<_Xiy10J6YA12In^={HX^V$!jfL*0%-A|qm8!1FtZuP6 zTZJ$x-D}}WBFrObEBm^uRw8j-el8kpPYshu`+1lfNcyMIlSEiqE3y>B6ks#j!XHfjN>l; zT{^1JNrfDqiq6@g>}oV{$F;W$h}jq6tCnqBG;n zxzqoRXMIN61s!`w9Q)v$WBoVqCVz^>G{ktE>2ty^q78iM!k5+3mmFY@wxINPC?i<5 zOSqPpbm_QCN8k;Y7LEZ+VUUGm$>D?Z;03m;)TvPZj9En>yMdfOL3(`sjIuz04TM)X z8S-B)UjhQBY1CI0CeZzoqaFw0m5A}Ux_{;Ouo;hbA2QGQpP4_?B{=A zXGWeKM5C+>sKsRw=CbS7%Ej2$^3+uL*Qc`2Yqu3F&T);y#Z}4dUKCOl{IjQQ;-v z637om@s|FIMBV43!P%gn4L4KA|0mpxJ3hIY>kw2K1Q>N|5Nv1&y&EwxG3g9z*pKLd z!-^A9KVfgKJ`RZ~4djN}g;P_fPUgiX^2>%F706oO z;46#?&e+~i<5L~zVXMV?XP9$+g>(LQ$X&0eGpoE3lCB<%H67E4_#@}BFZ98Lr@$#_y* zPSL#U2$iyf6&NnG_Wn>B?Qf*hDL()J literal 0 HcmV?d00001 diff --git a/anlex.py b/anlex.py index 33810c0..289d0d8 100644 --- a/anlex.py +++ b/anlex.py @@ -7,7 +7,7 @@ """ import sys import re - +from analisador_sintatico_expressao_aritmetica import Sintatico token = "" numerico = "" @@ -22,13 +22,14 @@ id_tabela = 0 acumula = "" -def verifica_erro(elemento,token_geral,lista_erros,linha,coluna): + +def verifica_erro(elemento, token_geral, lista_erros, linha, coluna): """Se não encontrar um erro retorna 1""" separadores = [';', '[', ']', ')', '(', ')', '{', '}', - ',', '=', '.','-', '+', '/', '*', '^','!','&','|','>','<'] - if not re.match("[\w]",elemento): + ',', '=', '.', '-', '+', '/', '*', '^', '!', '&', '|', '>', '<'] + if not re.match("[\w]", elemento): if elemento not in separadores: - if not re.search(r"\s",elemento): + if not re.search(r"\s", elemento): token_geral.append("[Token Inválido]") lista_erros.append( [elemento, add_linha_coluna(elemento, linha, coluna)]) @@ -36,11 +37,10 @@ def verifica_erro(elemento,token_geral,lista_erros,linha,coluna): return 1 - def aux_agrupa(elemento, i, lista, cont, elemento_double, next_elemento): """Auxilia a função que agrupa""" if elemento in i: - if (cont+1)