Bora vê
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

sintatico.py 3.6KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. def analisadorsintatico(dict1, dict2, programa, args,erro):
  2. pilha = ["<INICIO>"]#inicializa a pilha com o Não terminal inicial
  3. if args.ls : #Se verdadeiro mostra a mensagem a seguir
  4. print ('#'*80)
  5. print("Foi adcionado a pilha: " + pilha[-1])
  6. #dicionario para cada token e sua representação no código
  7. 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",
  8. "senao":"senao","enquanto":"enquanto", "menor":"<", "maior":">", "recebe":"=", "soma":"+" ,"subtracao":"-","multiplicacao":"*", "divisao": '//'}
  9. i=0#inicializa a posição
  10. while i <= (len(programa)-1):
  11. if pilha[-1] == programa[i][0]:#verifica se o topo da pilha é igual ao token na fila do programa
  12. if args.ls:#Se verdadeiro mostra a mensagem a seguir
  13. print("Foi despilhado: " + pilha[-1])
  14. pilha.pop()
  15. i += 1
  16. else:
  17. if (pilha[-1], programa[i][0]) in dict1:#verifica se existe <Não terminal> junto com inicio da fila forma uma chave
  18. 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
  19. if args.ls:
  20. print("Foi despilhado: " + pilha[-1])
  21. print("Foi empilhado: ")
  22. a = dict2[dict1[pilha[-1], programa[i][0]][0]]
  23. a.reverse()
  24. 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
  25. a.reverse()
  26. exp = dict2[dict1[pilha[-1], programa[i][0]][0]]#recebe a expressão que vai ser empilhada
  27. if not exp:
  28. if args.ls: #Se verdadeiro mostra a mensagem a seguir
  29. print("Foi tirado da pilha: "+pilha[-1])
  30. pilha.pop() #desempilha o topo da pilha
  31. else:
  32. pilha.pop()#desempilha o topo da pilha
  33. exp.reverse()#inverte a expresão antes de colocar na pilha
  34. pilha.extend(exp)#empilha na pilha
  35. exp.reverse()#inverte novamente
  36. else:#Caso não encontre a chave
  37. a = []
  38. if '<' in pilha[-1]:
  39. dict = []
  40. '''
  41. cria uma extenção do dicionario, primeirente apresenta todos os itens e os filtra se o topo da pilha
  42. estiver nas chaves do dicionario 1 e os adciona
  43. '''
  44. dict.extend([ele[1] for ele in dict1 if pilha[-1] in ele])#
  45. #Adciona apenas os elementos filtrados
  46. a.extend([token[ele] for ele in dict if ele])
  47. else:
  48. # se top não for um não terminal ele apenas adciona o topo da pilha
  49. a.extend(token[pilha[-1]])
  50. erro.append('########################################################')
  51. erro.append('Erro sintático')
  52. erro.append(f"\'{programa[i-1][1]}\' inesperado linha {programa[i-1][2]}, coluna {programa[i-1][3]}")#
  53. erro.append(f"Era esperado: {' '.join(a)}")
  54. args.ls = False
  55. break
  56. if args.ls:#Se for True imprime a mensagem
  57. args.ls=True
  58. print("Sintatico terminado com Sucesso")