1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859 |
- def analisadorsintatico(dict1, dict2, programa, args,erro):
- pilha = ["<INICIO>"]#inicializa a pilha com o Não terminal inicial
- if args.ls : #Se verdadeiro mostra a mensagem a seguir
- print ('#'*80)
- print("Foi adcionado a pilha: " + pilha[-1])
- #dicionario para cada token e sua representação no código
- token={"a_parentese":"(" ,"f_parentese":")", "virgula":",","inicio":"{", "fim":"}", "fim_linha":";","id":"id","numero":"numero", "frase":"frase", "programa":"programa" ,"fimprograma":"fimprograma", "inteiro":"declaração", "leia":"leia" ,"escreva":"escreva", "se":"se",
- "senao":"senao","enquanto":"enquanto", "menor":"<", "maior":">", "recebe":"=", "soma":"+" ,"subtracao":"-","multiplicacao":"*", "divisao": '//'}
- i=0#inicializa a posição
- while i <= (len(programa)-1):
- if pilha[-1] == programa[i][0]:#verifica se o topo da pilha é igual ao token na fila do programa
- if args.ls:#Se verdadeiro mostra a mensagem a seguir
- print("Foi despilhado: " + pilha[-1])
- pilha.pop()
- i += 1
- else:
- if (pilha[-1], programa[i][0]) in dict1:#verifica se existe <Não terminal> junto com inicio da fila forma uma chave
- if dict2[dict1[pilha[-1], programa[i][0]][0]]:#Faz mesma verificação da existencia de chave e imprime na tela se args.ls for verdadeiro para o usuario
- if args.ls:
- print("Foi despilhado: " + pilha[-1])
- print("Foi empilhado: ")
- a = dict2[dict1[pilha[-1], programa[i][0]][0]]
- a.reverse()
- print(f"Expressão {dict1[pilha[-1], programa[i][0]][0]}:", a)#Retorna o numero da expressão que foi adcionado na pilha e expressão na ordem que foi empilhada
- a.reverse()
-
- exp = dict2[dict1[pilha[-1], programa[i][0]][0]]#recebe a expressão que vai ser empilhada
- if not exp:
- if args.ls: #Se verdadeiro mostra a mensagem a seguir
- print("Foi tirado da pilha: "+pilha[-1])
- pilha.pop() #desempilha o topo da pilha
- else:
- pilha.pop()#desempilha o topo da pilha
- exp.reverse()#inverte a expresão antes de colocar na pilha
- pilha.extend(exp)#empilha na pilha
- exp.reverse()#inverte novamente
- else:#Caso não encontre a chave
- a = []
- if '<' in pilha[-1]:
- dict = []
- '''
- cria uma extenção do dicionario, primeirente apresenta todos os itens e os filtra se o topo da pilha
- estiver nas chaves do dicionario 1 e os adciona
- '''
- dict.extend([ele[1] for ele in dict1 if pilha[-1] in ele])#
- #Adciona apenas os elementos filtrados
- a.extend([token[ele] for ele in dict if ele])
- else:
- # se top não for um não terminal ele apenas adciona o topo da pilha
- a.extend(token[pilha[-1]])
- erro.append('########################################################')
- erro.append('Erro sintático')
- erro.append(f"\'{programa[i-1][1]}\' inesperado linha {programa[i-1][2]}, coluna {programa[i-1][3]}")#
- erro.append(f"Era esperado: {' '.join(a)}")
- args.ls = False
- break
- if args.ls:#Se for True imprime a mensagem
- args.ls=True
- print("Sintatico terminado com Sucesso")
|