Skip to content

Commit

Permalink
analisador sintatico
Browse files Browse the repository at this point in the history
  • Loading branch information
cmagnobarbosa committed Jun 15, 2017
1 parent d3d6128 commit 59d7d43
Show file tree
Hide file tree
Showing 7 changed files with 149 additions and 191 deletions.
216 changes: 116 additions & 100 deletions analisador_sintatico_expressao_aritmetica.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Binary file added analisador_sintatico_expressao_aritmetica.pyc
Binary file not shown.
44 changes: 24 additions & 20 deletions anlex.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
"""
import sys
import re

from analisador_sintatico_expressao_aritmetica import Sintatico

token = ""
numerico = ""
Expand All @@ -22,25 +22,25 @@
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)])
return 0
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)<len(lista):
if (cont + 1) < len(lista):
if next_elemento in lista[cont + 1]:
lista.pop(cont + 1)
lista.insert(cont, [elemento_double])
Expand Down Expand Up @@ -156,7 +156,7 @@ def open_file():

if ver_num(k) and ver_iden(k) and estado == 0 and estado != 4:
"""Se não for um identificador valido então é um separador"""
if verifica_erro(k,token_geral,lista_erros,linha,coluna):
if verifica_erro(k, token_geral, lista_erros, linha, coluna):
token_geral.append([k])

if estado is 1:
Expand All @@ -175,7 +175,7 @@ def open_file():
["Res Cod: " + str(verifica_reservada(token)), token, id_tabela])

if k is not " ":
if verifica_erro(k,token_geral,lista_erros,linha,coluna):
if verifica_erro(k, token_geral, lista_erros, linha, coluna):
token_geral.append([k])
token = ""
else:
Expand All @@ -188,8 +188,8 @@ def open_file():
if ver_iden(k):

"""Vai inserir o k como separador """
if k is not re.match(r"\s",k):
if verifica_erro(k,token_geral,lista_erros,linha,coluna):
if k is not re.match(r"\s", k):
if verifica_erro(k, token_geral, lista_erros, linha, coluna):
"""Se não encontrar um erro insere"""
token_geral.append([k])
estado = 0
Expand All @@ -210,7 +210,7 @@ def open_file():
token_geral.append(
["NUM", valor.group(), id_tabela])
if k is not " ":
if verifica_erro(k,token_geral,lista_erros,linha,coluna):
if verifica_erro(k, token_geral, lista_erros, linha, coluna):
token_geral.append([k])
estado = 0
numerico = ""
Expand All @@ -226,7 +226,7 @@ def open_file():
if ver_num(k):
"Armazena token de separadores"
if k is not " ":
if verifica_erro(k,token_geral,lista_erros,linha,coluna):
if verifica_erro(k, token_geral, lista_erros, linha, coluna):
token_geral.append([k])
estado = 0

Expand All @@ -252,10 +252,14 @@ def open_file():
token_geral.append("[*/]")
estado = 0

agrupa(token_geral)
exibe_imprime("token_saida", token_geral)
print "Erros ", exibe_imprime("lista_erros", lista_erros)
lista_erros = []
print "Tabela", tabela_token
imprime_tabela(tabela_token)
print "Comentário:", acumula
if __name__ == '__main__':
sin = Sintatico()
agrupa(token_geral)
#exibe_imprime("token_saida", token_geral)
# print token_geral
sin.conector(token_geral)
# print "Erros ", exibe_imprime("lista_erros", lista_erros)
lista_erros = []
print "Tabela", tabela_token
imprime_tabela(tabela_token)
# print "Comentário:", acumula
3 changes: 1 addition & 2 deletions lista_erros
Original file line number Diff line number Diff line change
@@ -1,2 +1 @@
['8int', 'L:8 C:(3,7)']
['$', 'L:13 C:(6,7)']
Lista vazia
25 changes: 4 additions & 21 deletions tabela_simbolos_simp
Original file line number Diff line number Diff line change
@@ -1,22 +1,5 @@
Tabela de Simbolos
Chave:47 ['Res Cod: 1', 'int', 'L:7 C:(1,4)']
Chave:52 ['ID ', 'main', 'L:7 C:(5,9)']
Chave:65 ['ID ', 'd', 'L:8 C:(8,9)']
Chave:67 ['NUM', '0', 'L:8 C:(10,11)']
Chave:74 ['Res Cod: 1', 'int', 'L:9 C:(3,6)']
Chave:76 ['ID ', 'c', 'L:9 C:(7,8)']
Chave:78 ['NUM', '0', 'L:9 C:(9,10)']
Chave:87 ['Res Cod: 2', 'float', 'L:10 C:(3,8)']
Chave:89 ['ID ', 'a', 'L:10 C:(9,10)']
Chave:94 ['NUM', '7.77', 'L:10 C:(11,15)']
Chave:101 ['Res Cod: 7', 'for', 'L:11 C:(3,6)']
Chave:103 ['ID ', 'd', 'L:11 C:(7,8)']
Chave:105 ['NUM', '0', 'L:11 C:(9,10)']
Chave:107 ['ID ', 'd', 'L:11 C:(11,12)']
Chave:110 ['NUM', '10', 'L:11 C:(13,15)']
Chave:112 ['ID ', 'd', 'L:11 C:(16,17)']
Chave:127 ['Res Cod: 6', 'printf', 'L:12 C:(5,11)']
Chave:133 ['Literal', '"%d', 'L:12 C:(14,17)']
Chave:136 ['ID ', 'd', 'L:12 C:(19,20)']
Chave:159 ['Res Cod: 9', 'return', 'L:15 C:(3,9)']
Chave:161 ['NUM', '0', 'L:15 C:(10,11)']
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)']
2 changes: 1 addition & 1 deletion teste.c
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
// int
float
a=(3+5)*alpha
Loading

0 comments on commit 59d7d43

Please sign in to comment.