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.

semantico.py 2.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. def semantico(token, args, erro):
  2. Avariaveis(token, args,erro)
  3. def divisao(token, args, lista,erro):
  4. linha = []
  5. i=0
  6. if args.lse:
  7. print("Verificando Divisão por Zero.")
  8. while (i < len(token)):
  9. if 'recebe' in token[i][0]:
  10. j=i+1
  11. variavel = token[i-1][1]
  12. try:
  13. while not 'fim_linha' in token[j][0]:
  14. if (str(token[j][1][0])).isdigit():
  15. linha.append(str(token[j][1][0]))
  16. else:
  17. linha.append(token[j][1])
  18. j+=1
  19. except IndexError:
  20. break
  21. if verificando(variavel, linha, lista, erro):
  22. erro.append(f'linha:{token[i][2]}')
  23. linha.clear()
  24. i+=1
  25. def verificando(variavel, linha, lista,erro):
  26. i=0
  27. antigo=''.join(linha)
  28. while i<len(linha):
  29. if linha[i].isidentifier:
  30. if linha[i] in lista:
  31. linha[i]=lista[linha[i]]
  32. else:
  33. pass
  34. i+=1
  35. try:
  36. expre=''.join(linha)
  37. eval(expre)
  38. except ZeroDivisionError:
  39. erro.append('########################################################')
  40. erro.append('Erro semantico:')
  41. erro.append(f'Divisão por Zero {antigo}')
  42. return 1
  43. lista[variavel]=str(eval(''.join(linha)))
  44. return 0
  45. def trocandoValores(lista,a,key):
  46. import re
  47. for exp in lista.keys():
  48. if exp in a:
  49. a=re.sub(r''+exp, (''.join(lista[exp])),''.join(a))
  50. lista[key] = ''.join(a)
  51. def Avariaveis(token, args,erro):
  52. variaveis = {}
  53. if args.lse:
  54. print ('#' * 80)
  55. print('Carregando Tabela de Variveis.')
  56. print("Verificando Variaveis Duplicadas.")
  57. for var in token:
  58. if 'id' in var and var[2] == 2:
  59. if var[1] not in variaveis:
  60. variaveis[var[1]] = '0'
  61. else:
  62. erro.append('########################################################')
  63. erro.append('Erro semantico:')
  64. erro.append(f'\'{var[1]}\' declaração duplicada: ')
  65. if args.lse:
  66. print("Variaveis declaradas: ")
  67. for var in variaveis.items():
  68. print(var[0])
  69. print("Verificando Variaveis não declaradas.")
  70. for code in token:
  71. if 'id' in code:
  72. if not (code[1] in variaveis):
  73. erro.append('########################################################')
  74. erro.append('Erro semantico:')
  75. erro.append(f'Variavel \'{code[1]}\' não declarado: linha{code[2]} : coluna{code[3]}')
  76. divisao(token, args, variaveis, erro)