Advertisement
Guest User

Untitled

a guest
Aug 31st, 2015
64
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.80 KB | None | 0 0
  1. # -*- coding: utf-8 -*-
  2.  
  3. # Implementación de un scanner mediante la codificación de un Autómata
  4. # Finito Determinista como una Matríz de Transiciones
  5. # Autor: Dr. Santiago Conant, Agosto 2014 (modificado en Agosto 2015)
  6.  
  7. import sys
  8.  
  9. # tokens
  10. INT = 100 # Número entero
  11. FLT = 101 # Número de punto flotante
  12. OPB = 102 # Operador binario
  13. LRP = 103 # Delimitador: paréntesis izquierdo
  14. RRP = 104 # Delimitador: paréntesis derecho
  15. END = 105 # Fin de la entrada
  16. ERR = 200 # Error léxico: palabra desconocida
  17. COM = 106 # COMA
  18.  
  19.  
  20. # Matriz de transiciones: codificación del AFD
  21. # [renglón, columna] = [estado no final, transición]
  22. # Estados > 99 son finales (ACEPTORES)
  23. # Caso especial: Estado 200 = ERROR
  24. # dig op ( ) raro esp . $ ,
  25. MT = [[ 1, OPB, LRP, RRP, 4, 0, 4, END, COM], # edo 0 - estado inicial
  26. [ 1, INT, INT, INT, INT, INT, 2, INT, INT], # edo 1 - dígitos enteros
  27. [ 3, ERR, ERR, ERR, 4, ERR, 4, ERR, ERR], # edo 2 - primer decimal flotante
  28. [ 3, FLT, FLT, FLT, FLT, FLT, 4, FLT, FLT], # edo 3 - decimales restantes flotante
  29. [ERR, ERR, ERR, ERR, 4, ERR, 4, ERR, ERR]] # edo 4 - estado de error
  30.  
  31. # Filtro de caracteres: regresa el número de columna de la matriz de transiciones
  32. # de acuerdo al caracter dado
  33. def filtro(c):
  34. """Regresa el número de columna asociado al tipo de caracter dado(c)"""
  35. if c == '0' or c == '1' or c == '2' or \
  36. c == '3' or c == '4' or c == '5' or \
  37. c == '6' or c == '7' or c == '8' or c == '9': # dígitos
  38. return 0
  39. elif c == '+' or c == '-' or c == '*' or \
  40. c == '/': # operadores
  41. return 1
  42. elif c == '(': # delimitador (
  43. return 2
  44. elif c == ')': # delimitador )
  45. return 3
  46. elif c == ' ' or ord(c) == 9 or ord(c) == 10 or ord(c) == 13: # blancos
  47. return 5
  48. elif c == '.': # punto
  49. return 6
  50. elif c == '$': # fin de entrada
  51. return 7
  52. elif c == ',': #coma
  53. return 8
  54. else: # caracter raro
  55. return 4
  56.  
  57. _c = None # siguiente caracter
  58. _leer = True # indica si se requiere leer un caracter de la entrada estándar
  59.  
  60. # Función principal: implementa el análisis léxico
  61. def obten_token():
  62. """Implementa un analizador léxico: lee los caracteres de la entrada estándar"""
  63. global _c, _leer
  64. edo = 0 # número de estado en el autómata
  65. lexema = "" # palabra que genera el token
  66. while (True):
  67. while edo < 100: # mientras el estado no sea ACEPTOR ni ERROR
  68. if _leer: _c = sys.stdin.read(1)
  69. else: _leer = True
  70. edo = MT[edo][filtro(_c)]
  71. if edo < 100 and edo != 0: lexema += _c
  72. if edo == INT:
  73. _leer = False # ya se leyó el siguiente caracter
  74. print "Entero", lexema
  75. return INT
  76. elif edo == FLT:
  77. _leer = False # ya se leyó el siguiente caracter
  78. print "Flotante", lexema
  79. return FLT
  80. elif edo == OPB:
  81. lexema += _c # el último caracter forma el lexema
  82. print "Operador", lexema
  83. return OPB
  84. elif edo == LRP:
  85. lexema += _c # el último caracter forma el lexema
  86. print "Delimitador", lexema
  87. return LRP
  88. elif edo == RRP:
  89. lexema += _c # el último caracter forma el lexema
  90. print "Delimitador", lexema
  91. return RRP
  92. elif edo == COM:
  93. lexema += _c
  94. print "Coma", lexema
  95. return RRP
  96. elif edo == END:
  97. print "Fin de expresion"
  98. return END
  99. else:
  100. leer = False # el último caracter no es raro
  101. print "ERROR! palabra ilegal", lexema
  102. return ERR
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement