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.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. def analisadorsintatico(dict1, dict2, programa, args):
  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. from colorama import Fore, Style
  51. t = Fore.CYAN +"Erro Sintatico ".upper()#imprimi bunitinho
  52. print(t)
  53. print(f"\'{programa[i][1]}\' inesperado linha {programa[i][2]}, coluna {programa[i][3]}")#
  54. space = " "*int(programa[i][3])
  55. texto = []
  56. with open(args.filename, 'r') as f:
  57. for i in range(programa[i][2]):
  58. texto = f.readline()
  59. print(texto+space+'^')
  60. print(f"Era esperado: {' '.join(a)}"+Style.RESET_ALL)
  61. args.ls = False
  62. break
  63. if args.ls:#Se for True imprime a mensagem
  64. args.ls=True
  65. print("Sintatico terminado com Sucesso")