Skip to content

Commit

Permalink
Versão 1 da gramática ok , att v1 ok #17
Browse files Browse the repository at this point in the history
  • Loading branch information
cmagnobarbosa committed Jun 18, 2017
1 parent 59d7d43 commit a525513
Show file tree
Hide file tree
Showing 6 changed files with 113 additions and 43 deletions.
142 changes: 107 additions & 35 deletions analisador_sintatico_expressao_aritmetica.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):

Expand All @@ -43,46 +49,63 @@ 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."""
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"
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"""
Expand All @@ -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)
Binary file modified analisador_sintatico_expressao_aritmetica.pyc
Binary file not shown.
1 change: 0 additions & 1 deletion anlex.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@
import sys
import re
from analisador_sintatico_expressao_aritmetica import Sintatico

token = ""
numerico = ""
estado = 0
Expand Down
6 changes: 2 additions & 4 deletions tabela_simbolos_simp
Original file line number Diff line number Diff line change
@@ -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)']
2 changes: 1 addition & 1 deletion teste.c
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
// int
a=(3+5)*alpha
int a;
5 changes: 3 additions & 2 deletions teste2.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}

0 comments on commit a525513

Please sign in to comment.