INTEGRANTES:
GRUPO: A
MATERIA: COMPILADORES
Programas
Fuente – Matlab
Construcción -
Objeto – Python
Expresiones Regulares
Tokens
'IDENTIFICADOR',
'SIGNO',
'NUMERO',
'CADENA',
Palabras Reservadas
'if': 'IF',
'while': 'WHILE',
'else': 'ELSE',
'int': 'INT',
'for': 'FOR',
'end': 'END',
Signos
'+': 'SUMA',
'-': 'RESTA',
'*': 'MULTIPLICADOR',
'/': 'DIVISON',
'=': 'IGUAL',
';': 'PUNTOCOMA',
':': 'DOSPUNTOS',
'(': 'PARIZQ',
')': 'PARDER',
Definiciones
Numero
Identificador
Cadena
Signo
Nueva Línea
Error
Componentes
Tabla de Símbolos
Operad
Significado
or
+ Suma
- Resta
Multiplicaci
*
ón
/ División
= Igualdad
Punto
;
Coma
: Dos Puntos
Par
(
Izquierdo
Par
)
Derecho
Codigo
import ply.lex as lex
signo = {
'+': 'SUMA',
'-': 'RESTA',
'*': 'MULTIPLICADOR',
'/': 'DIVISON',
'=': 'IGUAL',
';': 'PUNTOCOMA',
':': 'DOSPUNTOS',
'(': 'PARIZQ',
')': 'PARDER',
}
tokens = [
'IDENTIFICADOR',
'SIGNO',
'NUMERO',
'CADENA',
] + list(palabras_reservadas.values()) + list(signo.values())
def t_NUMERO(t):
r'\d+'
t.value = int(t.value)
return t
def t_IDENTIFICADOR(t):
r'\w+(_\d\w)*'
t.type = palabras_reservadas.get(t.value, 'IDENTIFICADOR')
return t
def t_CADENA(t):
r'\"?(\w+ \ *\w*\d* \ *)\"?'
return t
def t_SIGNO(t):
r'[+-/*=;:()]'
t.type = signo.get(t.value,'SIGNO')
return t
def t_newline(t):
r'\n+'
t.lexer.lineno += len(t.value)
def t_error(t):
global resultado_lexema
estado = "** Token no valido en la Linea {:4} Valor {:16} Posicion
{:4}".format(str(t.lineno), str(t.value),
str(t.lexpos))
resultado_lexema.append(estado)
t.lexer.skip(1)
# Prueba de ingreso
def prueba(data):
global resultado_lexema
analizador = lex.lex()
analizador.input(data)
resultado_lexema[:] = []
while True:
tok = analizador.token()
if not tok:
break
if __name__ == '__main__':
codigo = open('prueba.txt', 'r')
codigo = codigo.read()
my_list = codigo.splitlines()
Análisis léxico. Consiste en agrupar caracteres para formar las unidades que ya tienen
análisis semántico.
Optimización del código. Es una sección optativa pero muy difundida y demandada
entre los compiladores profesionales. Por ello, Los constructores de compiladores gastan
compilador.
NOTA. Los objetos del programa pueden ser simples (enteros, reales) o complejos (matrices, registros,
funciones,
procedimientos). Tienen un identificador asociado, una posición en memoria, un valor y unos atributos.
El valor es el
almacenado en la zona de memoria que ocupa el objeto y los atributos determinan los valores que
puede tomar el
Las tablas de símbolos tienen al menos la siguiente información respecto de cada objeto del programa.
Su nombre o denotador, Los atributos (el más importante es el tipo), Su posición en memoria o la forma
de encontrarla...
Divide el código por tramos delimitados por marcas de bloque (begin y end en Pascal).
Si en un tramo de código encuentra demasiados errores (entra en modo panic) lo ignora y pasa a
compilar el siguiente tramo. En consecuencia, cuando el compilador nos indica los errores que ve
tenemos que ser conscientes de que son consecuencia de las partes compiladas y de las no compiladas.
Descripción de los autómatas finito para que sea determinístico
Un autómata finito (AF) o máquina de estado finito es un modelo computacional que realiza cómputos
en forma automática sobre una entrada para producir una salida. Este modelo está conformado por un
alfabeto, un conjunto de estados finito, una función de transición, un estado inicial y un conjunto de
estados finales. Su funcionamiento se basa en una función de transición, que recibe a partir de un
estado inicial una cadena de caracteres pertenecientes al alfabeto (la entrada), y que va leyendo dicha
cadena a medida que el autómata se desplaza de un estado a otro, para finalmente detenerse en un
estado final o de aceptación, que representa la salida. La finalidad de los autómatas finitos es la de
reconocer lenguajes regulares, que corresponden a los lenguajes formales más simples según la
Jerarquía de Chomsky.
Un autómata finito determinista (abreviado AFD) es un autómata finito que además es un sistema
determinista; es decir, para cada estado en que se encuentre el autómata, y con cualquier símbolo del
alfabeto leído, existe siempre no más de una transición posible desde ese estado y con ese símbolo.
Q es un conjunto de estados;
∑ es un alfabeto;
Que existan dos transiciones del tipo δ(q,a)=q1 y δ(q,a)=q2, siendo q1 ≠ q2;
Que existan transiciones del tipo δ(q, ε), donde ε es la cadena vacía, salvo que q sea un estado
final, sin transiciones hacia otros estados.