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.

lexical.py 2.5KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. import collections
  2. import re
  3. def tokenize(code,args,erro):
  4. token = collections.namedtuple('Token', ['tipo', 'lexema', 'linha', 'coluna'])
  5. token_especificacao = [
  6. ('inicio' ,r'\{'), #inicio {
  7. ('fim' ,r'\}'), # fim }
  8. ('a_parentese' ,r'\('), #parentese de abertura
  9. ('f_parentese' ,r'\)'), #parentese de fechamento
  10. ('leia' ,r'leia'), #leia
  11. ('escreva' ,r'escreva'), #escreva
  12. ('senao', r'senao'), # senao
  13. ('se' ,r'se'), #se
  14. ('enquanto' ,r'enquanto'), #enquanto
  15. ('programa' ,r'programa'), #programa
  16. ('fimprograma' ,r'fimprograma'), #fimprograma
  17. ('inteiro' ,r'inteiro'), #variavel
  18. ('numero' ,r'[+-]?[0-9]+'), # inteiro
  19. ("fim_linha" ,r';'), #fim de linha
  20. ("virgula" ,r','), # virgula
  21. ('recebe' ,r'='), # recebe
  22. ('id' ,r'[A-Za-z]([A-Za-z0-9_])*'), # Id
  23. ('subtracao' ,r'\-'), #subtração
  24. ('soma' ,r'\+'), #soma
  25. ('multiplicacao',r'\*'), #multiplicação
  26. ('divisao' ,r'/'), #divisão
  27. ('WS' ,r' +'), # espaço
  28. ('menor' ,r'<'), #operadore lógico menor
  29. ('maior' ,r'>'), #operador lógico maior
  30. ('frase' ,r'".*?"'), #frase
  31. ('ERRO' ,r'.'), # qualquer caracter não identificado
  32. ('Linha' ,r'\n'), #fim de linha
  33. ]
  34. token_regex = '|'.join('(?P<%s>%s)' % pair for pair in token_especificacao)
  35. linha = 1
  36. linha_inicia = 0
  37. for mo in re.finditer(token_regex, code):
  38. tipo = mo.lastgroup
  39. valor = mo.group(tipo)
  40. if (tipo == 'Linha'):
  41. linha_inicia = mo.end()
  42. linha += 1
  43. elif tipo == 'tab':
  44. pass
  45. elif tipo == 'ERRO':
  46. erro.append('########################################################')
  47. erro.append(f'Erro lexico')
  48. erro.append(f'{valor!r} não esperado na linha {linha} e coluna {coluna}')
  49. if valor == '"':
  50. erro.append(f'" de fechamento não encontrada')
  51. else:
  52. erro.append(f'caracter desconhecido')
  53. pass
  54. coluna = mo.start() - linha_inicia
  55. if (tipo != 'ERRO') and (tipo != 'Linha') and (tipo != 'WS'):
  56. yield token(tipo, valor, linha, coluna)