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

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. import re
  2. def semantico(token, args, erro):
  3. Avariaveis(token, args,erro)
  4. def divisao(token, args, lista,erro):
  5. linha = []
  6. i=0
  7. if args.lse:
  8. print("Verificando Divisão por Zero.")
  9. while (i < len(token)):
  10. if 'recebe' in token[i][0]:
  11. j=i+1
  12. variavel = token[i-1][1]
  13. try:
  14. while not 'fim_linha' in token[j][0]:
  15. if (str(token[j][1][0])).isdigit():
  16. linha.append(str(token[j][1][0]))
  17. else:
  18. linha.append(token[j][1])
  19. j+=1
  20. except IndexError:
  21. break
  22. if verificando(variavel, linha, lista, erro):
  23. erro.append(f'linha:{token[i][2]}')
  24. linha.clear()
  25. i+=1
  26. def verificando(variavel, linha, lista,erro):
  27. i=0
  28. antigo=''.join(linha)
  29. while i<len(linha):
  30. if linha[i].isidentifier:
  31. if linha[i] in lista:
  32. linha[i]=lista[linha[i]]
  33. else:
  34. pass
  35. i+=1
  36. try:
  37. expre=''.join(linha)
  38. eval(expre)
  39. except ZeroDivisionError:
  40. erro.append('########################################################')
  41. erro.append('Erro semantico:')
  42. erro.append(f'Divisão por Zero {antigo}')
  43. return 1
  44. lista[variavel]=str(eval(''.join(linha)))
  45. return 0
  46. def trocandoValores(lista,a,key):
  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)