Advertisement
mrDarkYoh

analisadorLexico.py

Sep 19th, 2019
123
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.03 KB | None | 0 0
  1. # Analisador lexico
  2. import ply.lex  as lex
  3. import re as re
  4. import easygui
  5. import sys
  6.  
  7. # Palavras reservadas
  8. palavrasReservadas = {
  9.     "programa" : "PROGRAMA",
  10.     "const" : "CONST",
  11.     "procedure" : "PROCEDURE",
  12.     "function" : "FUNCTION",
  13.     "begin" : "BEGIN",
  14.     "end" : "END",
  15.     "escreva" : "ESCREVA",
  16.     "leia" : "LEIA",
  17.     "printf" : "PRINTF",
  18.     "if" : "IF",
  19.     "else" : "ELSE",
  20.     "para" : "PARA",
  21.     "for"  : "FOR",
  22.     "to"   : "TO",
  23.     "do"   : "DO",
  24.     "strcpy"  : "STRCPY",
  25.     "strcat"  : "STRCAT",
  26.     "strlen"  : "STRLEN",
  27.     "inteiro" : "INTEIRO",
  28.     "int"   : "INT",
  29.     "integer" : "INTEGER",
  30.     "real"  : "REAL",
  31.     "string" : "STRING",
  32.     "char" : "CHAR",
  33.     "e" : "E",
  34.     "ou" : "OU",
  35.     "or" : "OR",
  36.     "and" : "AND",
  37.     "nao" :"NAO",
  38. }
  39.  
  40. # Lista de Tokens
  41. tokens = [
  42.     "PONTO_E_VIRGULA","IGUAL","ATRIBUICAO","DOIS_PONTOS","PARENTESES_ESQ",
  43.     "PARENTESES_DIR","CHAVETA_ESQ","CHAVETA_DIREITA","COLCHETES_ESQ",
  44.     "COLCHETES_DIR","ASPAS","VIRGULA","SOMA","SUBTRACAO","MULTIPLICACAO",
  45.     "DIVISAO","IGUAL_A","DIFERENTE_DE","MAIOR_QUE","MENOR_QUE","MAIOR_OU_IGUAL_QUE",
  46.     "MENOR_OU_IGUAL_QUE","DUAS_BARRAS_OU","INCREMENTO","DECREMENTO","FORMATACAO_INT",
  47.     "FORMATACAO_CARACTER","FORMATACAO_REAL","FORMATACAO_INTEIRO","FORMATACAO_STRING",
  48.     "ID","NUMEROS","IGNORA"
  49. ]+list(palavrasReservadas.values())
  50.  
  51. # Formando os tokens
  52. t_PONTO_E_VIRGULA = r";"
  53. t_IGUAL = r"="
  54. t_ATRIBUICAO = r":="
  55. t_DOIS_PONTOS = r":"
  56. t_PARENTESES_ESQ = r"\("
  57. t_PARENTESES_DIR = r"\)"
  58. t_CHAVETA_ESQ = r"\{"
  59. t_CHAVETA_DIREITA = r"\}"
  60. t_COLCHETES_ESQ = r"\["
  61. t_COLCHETES_DIR = r"\]"
  62. t_ASPAS = r'\"\"'
  63. t_VIRGULA = r","
  64. t_SOMA = r"\+"
  65. t_SUBTRACAO = r"\-"
  66. t_MULTIPLICACAO = r"\*"
  67. t_DIVISAO = r"/"
  68. t_IGUAL_A = r"=="
  69. t_DIFERENTE_DE = r"!="
  70. t_MAIOR_QUE = r">"
  71. t_MENOR_QUE = r"<"
  72. t_MAIOR_OU_IGUAL_QUE = r">="
  73. t_MENOR_OU_IGUAL_QUE = r"<="
  74. t_IGNORA = r" \t\r\n"
  75. t_DUAS_BARRAS_OU = r"\|\|"
  76. t_INCREMENTO = r"\+\+"
  77. t_DECREMENTO = r"\-\-"
  78. t_FORMATACAO_INT = r"\%\'i'"
  79. t_FORMATACAO_CARACTER = r"\%\'c'"
  80. t_FORMATACAO_INTEIRO = r"\%\'d'"
  81. t_FORMATACAO_REAL = r"\%\r"
  82. t_FORMATACAO_STRING = r"\%\'s'"
  83. t_REAL = r"\d+\.\d+"
  84. t_INT = r"\d+"
  85. t_INTEIRO = r"\d+"
  86. t_INTEGER = r"\d+"
  87. t_STRING = r"\s+"
  88. t_CHAR = r"/^[A-Za-z]+$/"
  89.  
  90. # Funções para o analisador Lexico
  91. def t_error(t) :
  92.     # Caso encontrar um erro , pula o erro
  93.     t.lexer.skip(1)
  94.  
  95. # Formar identificadores
  96. def t_ID(t) :
  97.     r"_|([a-zA-ZáàÀÁâÂéèÈÉêÊíìÍÌóÓõÕôÕúÚçÇ])\w*_*\w*"
  98.     t.type = palavrasReservadas.get(t.value,'ID')
  99.     return t
  100.  
  101. # Para comentários
  102. def t_COMMENT(t) :
  103.     r'{[^}]*}'
  104.  
  105.  
  106. # Função responsável por iniciar a análise lexica
  107. def analisar(entrada) :
  108.     lexer = lex.lex()
  109.     lexer.input(entrada)
  110.     resultadoLexico = open("saidaLexica","w+")
  111.     while True :
  112.         tok = lexer.token()
  113.         if (not tok) :
  114.             break;
  115.         resultadoLexico.write("["+tok.type+","+tok.value+"]\n")
  116.         resultadoLexico.close()
  117.         print("Análise lexica feita com sucesso!")
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement