Академический Документы
Профессиональный Документы
Культура Документы
Yacc -Sin embargo, otro compilador compilador proporciona una herramienta general
para describir la entrada a un programa de ordenador. El usuario Yacc especifica las
estructuras de su entrada, junto con el cdigo que puede invocarse como se reconoce
cada dicha estructura. Yacc convierte tal especificacin en una subrutina que Han- agu- el
proceso de entrada; con frecuencia, es conveniente y apropiado que la mayor parte del
flujo de control en la aplicacin del usuario controlarlo mediante el subprograma.
Cmo funcionan?
El usuario proporciona el cdigo adicional ms all de la expresin que emparejan
necesita para completar sus tareas, posiblemente incluyendo cdigo escrito por
otros generadores. El programa que reconoce las expresiones se genera en el
lenguaje de programacin de propsito general empleado para fragmentos de
programas del usuario. De este modo, se proporciona un lenguaje de expresin de
alto nivel para escribir las expresiones de cadena que se ajustar mientras que la
libertad del usuario para escribir acciones es irreprochable. Esto evita obligando al
usuario que desee utilizar un lenguaje de manipulacin de cadenas para el anlisis
de entrada para escribir el procesamiento de programas para la misma y, a
menudo inapropiado lenguaje manejo de cadenas.
Lex no es un lenguaje completo, sino ms bien un generador que representa una
nueva caracterstica del lenguaje que se puede aadir a los diferentes lenguajes
de programacin, llamado `` lenguajes principales. '' As como lenguajes de
propsito general pueden producir cdigo a ejecutar en diferentes equipos
informticos, Lex puede escribir cdigo en diferentes lenguajes principales. El
lenguaje anfitrin se utiliza para el cdigo de salida generada por Lex y tambin
para los fragmentos de programas aadidos por el usuario. Lex convierte
expresiones y acciones (llamado origen en esta nota) en el host lenguaje de
propsito general del usuario; el programa generado se llama yylex. El programa
yylex reconocer expresiones en una corriente (llamada entrada en esta nota) y
llevar a cabo las acciones especificadas para cada expresin como se
detecte. Vase la Figura 1.
+ ------- +
Fuente -> | Lex | -> yylex
+ ------- +
+ ------- +
Entrada -> | yylex | -> Salida
+ ------- +
Una visin general de Lex
Figura 1
El autmata finito generado para esta fuente buscar ambas reglas a la vez,
observando a la terminacin de la serie de espacios en blanco o tabuladores si
hay o no un carcter de nueva lnea, y la ejecucin de la accin de la regla
deseada. La primera regla coincide con todas las cadenas de espacios en blanco
o tabuladores al final de las lneas, y la segunda regla todos los restantes cadenas
de espacios en blanco o tabuladores.
Lex puede ser utilizado solo para las transformaciones sencillas, o para el anlisis
y recopilacin de estadsticas en un nivel lxico. Lex tambin se puede utilizar con
un generador de analizador para llevar a cabo la fase de anlisis lxico; es
particularmente fcil para interactuar Lex y Yacc [3]. Programas Lex reconocen
expresiones slo regulares; Yacc escribe analizadores que aceptan una gran clase
de gramticas de contexto libre, pero requieren un analizador de nivel inferior para
reconocer tokens de entrada. Por lo tanto, una combinacin de Lex y Yacc es a
menudo apropiado. Cuando se utiliza como un preprocesador para un generador
de analizadores sintcticos ms tarde, Lex se utiliza para dividir el flujo de entrada,
y el generador de analizador asigna estructura a las piezas resultantes. El flujo de
control en este caso (que podra ser el primer medio de un compilador, por
ejemplo) se muestra en la Figura 2. Los programas adicionales, escrito por otros
generadores o con la mano, se puede aadir fcilmente a los programas escritos
por Lex.
gramtica lxica
reglas reglas
||
vv
+ + + --------- --------- +
| Lex | | Yacc |
+ + + --------- --------- +
||
vv
+ + + --------- --------- +
Entrada -> | yylex | -> | yyparse | -> entrada analizada
+ + + --------- --------- +
Yacc usuarios se darn cuenta de que el nombre yylex es lo Yacc espera que su
analizador lxico para ser nombrado, por lo que el uso de este nombre por Lex
simplifica la interfaz.
Lex genera un autmata finito determinista de las expresiones regulares en la
fuente [4]. El autmata se interpreta, en lugar de compilado, con el fin de ahorrar
JLex Especificaciones
Un archivo de entrada JLex est organizado en tres secciones, separadas por
directivas de dos por ciento (`` %% ''). Una especificacin adecuada JLex tiene el
siguiente formato.
cdigo de usuario
%%
Directivas JLex
%%
reglas de expresiones regulares
Las directivas `` %% '' distinguen secciones del archivo de entrada y se deben
colocar al principio de su lnea. El resto de la lnea que contiene el `%%` ''
directivas pueden ser descartados y no deben utilizarse para alojar declaraciones
o cdigo adicionales.
La seccin de cdigo de usuario - la primera seccin del archivo de especificacin
- se copia directamente en el archivo de salida resultante. Esta zona de la
especificacin proporciona espacio para la realizacin de clases de utilidad o tipos
de retorno.
La seccin de directivas JLex es la segunda parte del archivo de entrada. Aqu, las
definiciones de macros se dan y los nombres de estado se declaran.
La tercera seccin contiene las reglas de anlisis lxico, cada uno de los cuales
consta de tres partes: una lista opcional estado, una expresin regular, y una
accin.
El cdigo de usuario precede a la primera directiva de doble ciento (`` %% '). Este
cdigo se copia literalmente en el archivo de origen analizador lxico que JLex
salidas, en la parte superior del archivo. Por lo tanto, si el archivo de origen lexer
necesita comenzar con una declaracin del paquete o con la importacin de una
clase externa, la seccin de cdigo de usuario debe comenzar con la declaracin
correspondiente. Esta declaracin se copiar en la parte superior del archivo
fuente generada.
lex.py ofrece una interfaz externa en forma de una funcin de seal () que
devuelve el siguiente token vlido en el flujo de entrada. yacc.py llama a esto
varias veces para recuperar tokens e invocar las reglas gramaticales. La salida de
yacc.py es a menudo un rbol de sintaxis abstracta (AST). Sin embargo, esto es
totalmente en manos del usuario. Si se desea yacc.py tambin se puede utilizar
para implementar simples compiladores de una pasada.
Al igual que su contraparte Unix, yacc.py proporciona la mayor parte de las
caractersticas que usted espera incluyendo una extensa revisin de errores,
validacin de la gramtica, el apoyo a las producciones vacas, fichas de error y
resolucin de ambigedad a travs de reglas de precedencia. De hecho, todo lo
que es posible en yacc tradicional debe ser apoyado en capas.
La principal diferencia entre yacc.py y yacc Unix es que yacc.py no implica un
proceso de generacin de cdigo independiente. En su lugar, PLY se basa en la
reflexin (introspeccin) para construir sus lexers y analizadores. A diferencia de
tradicional lex / yacc que requieren un archivo de entrada especial que se
convierte en un archivo fuente separado las especificaciones que figuran a PLY
son programas Python vlidos. Esto significa que no hay archivos de origen
adicionales ni hay un paso especial construccin del compilador (por ejemplo,
correr yacc para generar cdigo Python para el compilador). Desde la generacin
de las tablas de anlisis sintctico es relativamente caro, PLY almacena en cach
los resultados y las guarda en un archivo. Si no se detectan cambios en la fuente
de entrada, las tablas se leen de la memoria cach. De lo contrario, se regeneran.
Uso
PLY consta de dos archivos: lex.py y yacc.py. Estos estn contenidos
dentro del directorio ply que tambin puede ser utilizado como un paquete de
python.
Como implementarlo.
Python Lex-Yacc
El extremo delantero del intrprete se implementa utilizando capas. No es de
extraar, PLY es una reescritura en Python de la Lex familiar y Yacc. Lex es un
analizador lxico responsable de tomar una secuencia de caracteres y dar salida a
una corriente de smbolos tales como enteros, cadenas, palabras clave y
smbolos. Por otro lado, Yacc es un analizador responsable de tomar una corriente
de tokens y reconociendo conjuntos de fichas como construcciones del lenguaje,
tales como declaraciones de variables, definicin de funciones, y si las
declaraciones.
CAPA fue desarrollado originalmente por David Beazley para una clase
introductoria sobre los compiladores de la Universidad de Chicago. Beazley
Python Lex
El primer paso para la implementacin de un intrprete es escribir la tokenizer
utilizando Python Lex; ver Listado Uno. Fichas se reconocen usando expresiones
regulares. Los pasos son sencillos:
1. Los nombres de todos los tipos de tokens vlidos se declaran como una lista de
cadenas con nombre fichas.
2. Las fichas que no requieren un procesamiento especial se declaran utilizando
variables de nivel de mdulo denominado t_TOKEN_TYPE donde TOKEN_TYPE
coincide con alguna cadena en la lista de "tokens". Cada una de estas variables
contiene una cadena de expresin regular que coincide con el smbolo
correspondiente (Python cuerdas primas se utilizan por lo general, ya que son la
forma ms conveniente de escribir cadenas de expresiones regulares).
nivel de mdulo llamado es ms eficiente para esta tarea. Una vez definidas las
reglas Tokenizer, lex.lex () se utiliza para construir el tokenizer. Un principal (por
ejemplo, si __name__ == '__main__' :) se incluye que pone a prueba la
funcionalidad del tokenizer mediante pruebas de regresin. Esta es una buena
prctica de programacin en Python, pero es casi imprescindible cuando se
escribe un idioma. (El cdigo fuente completo de principal est disponible
electrnicamente, vase "Centro de Recursos").
Python Yacc
El siguiente paso para la implementacin de un intrprete es escribir el analizador
utilizando Python Yacc; ver Listado Dos. Despus de importar la lista de fichas del
mdulo tokenizer escrito anteriormente, se definen una serie de funciones.
Ejemplo 1 muestra una tal funcin que reconoce una expresin en parntesis y
establece que el valor de toda la expresin es igual al valor de la expresin en el
parntesis. Cada funcin tiene una cadena de documentacin que contiene la
especificacin gramtica independiente del contexto apropiado (esta idea fue
tomada de SPARK kit de herramientas de John Aycock. Cada funcin tiene un
argumento nico, t, que es una secuencia de valores (empezando en el ndice 1)
que coinciden con los respectivos smbolos en la cadena de documentacin. Estos
valores son los mismos valores que se almacenaron en atributos t.value en el
tokenizer. El cuerpo de la funcin hace lo que el procesamiento es apropiado y
coloca el resultado en t [0].
Ejemplo:
# calclex.py
# tokenizer for a simple expression evaluator for
# numbers and +,-,*,/
import ply.lex as lex
# List of token names. This is always required
tokens = ( 'NUMBER', 'PLUS', 'MINUS', 'TIMES', 'DIVIDE', 'LPAREN', 'RPAREN',)
# Regular expression rules for simple tokens
t_PLUS = r'\+'
t_MINUS = r'-'
t_TIMES = r'\*'
t_DIVIDE = r'/'
t_LPAREN = r'\('
t_RPAREN = r'\)'
Webgrafia
http://www.dabeaz.com/ply/ply.html
https://ng.techweb.com/authds/gateway?gateway=true&return=http%3A%2F%2Fw
ww.drdobbs.com%2Fweb-development%2Fprototyping-interpreters-using-pythonle%2F184405580
https://escompiladores.wordpress.com/2014/03/11/ply-una-implementacion-de-lexy-yacc-en-python/
http://www.gacetadelinux.com/es/lg/issue79/divakaran.html
https://code.google.com/p/ply/
http://www.drdobbs.com/web-development/prototyping-interpreters-using-pythonle/184405580
http://es.wikipedia.org/wiki/Lex_(inform%C3%A1tica)
http://translate.google.com.mx/translate?hl=es419&sl=en&tl=es&u=http%3A%2F%2Fdinosaur.compilertools.net%2F&sandbox=1
http://translate.google.com.mx/translate?hl=es419&sl=en&u=http://www.cs.princeton.edu/~appel/modern/java/JLex/current/manu
al.html&prev=search
http://www.cc.uah.es/ie/docencia/ProcesadoresDeLenguaje/2.3.JLex.pdf