PLY (Python lex-Yacc) – Introducción

Todos hemos oído hablar de lex, que es una herramienta que genera un analizador léxico que luego se usa para tokenizar flujos de entrada y yacc, que es un generador de analizadores, pero hay una implementación de Python de estas dos herramientas en forma de módulos separados en un paquete llamado PLY. 

Estos módulos se denominan lex.py y yacc.py y funcionan de manera similar a las herramientas originales de UNIX, lex y yacc. 

PLY funciona de manera diferente a sus contrapartes de UNIX en el sentido de que no requiere un archivo de entrada especial, sino que toma el programa python como entradas directamente. Las herramientas tradicionales también hacen uso de tablas de análisis que son difíciles en el tiempo del compilador, mientras que PLY almacena en caché los resultados generados y los guarda para su uso y los regenera según sea necesario. 

PLY components

lex.py

Este es uno de los módulos clave de este paquete porque el funcionamiento de yacc.py también depende de lex.py, ya que es responsable de generar una colección de tokens a partir del texto de entrada y esa colección luego se identifica mediante las reglas de expresión regular. 

Para importar este módulo en su código python, use import ply.lex como lex 

Ejemplo: 
Suponga que escribió una expresión simple: y = a + 2 * b 

Cuando esto se pasa a través de ply.py, se generan los siguientes tokens 

'y','=', 'a', '+', '2', '*', 'b'

Estos tokens generados generalmente se usan con nombres de token que siempre son necesarios. 

#Token list of above tokens will be
tokens = ('ID','EQUAL','ID', 'PLUS', 'NUMBER', 'TIMES','ID' )

#Regular expression rules for the above example 
 t_PLUS    = r'\+'
 t_MINUS   = r'-'
 t_TIMES   = r'\*'
 t_DIVIDE  = r'/'

Más específicamente, estos se pueden representar como tuplas de tipo token y token  

('ID', 'y'), ('EQUALS', '='), ('ID', 'a'), ('PLUS', '+'), 
('NUMBER', '2'), ('TIMES', '*'), ('NUMBER', '3')

Este módulo también proporciona una interfaz externa en forma de token() que devuelve los tokens válidos de la entrada. 

yacc.py

Otro módulo de este paquete es yacc.py donde yacc significa Yet Another Compiler Compiler . Esto se puede usar para implementar compiladores de un solo paso. Proporciona muchas características que ya están disponibles en UNIX yacc y algunas características adicionales que le dan a yacc.py algunas ventajas sobre el yacc tradicional. 

Puede usar lo siguiente para importar yacc en su código python import ply.yacc as yacc

Estas características incluyen: 

  1. Análisis LALR(1)
  2. Validación de gramática
  3. Apoyo a producciones vacías
  4. Amplia capacidad de comprobación de errores
  5. Resolución de ambigüedad

Yacc.py también utiliza el token() de generación de tokens explícito, que lo llama continuamente a pedido del usuario para recopilar tokens y reglas gramaticales. yacc.py escupe Abstract Syntax Tree (AST) como salida. 

Ventaja sobre UNIX yacc: 
la implementación de Python yacc.py no implica un proceso de generación de código, sino que utiliza la reflexión para hacer sus lexers y analizadores, lo que ahorra espacio ya que no requiere ningún paso adicional de construcción del compilador ni generación de archivos de código. 
Para importar los tokens de su archivo lex, use from lex_file_name_here import tokens donde los tokens son la lista de tokens especificados en el archivo lex. 
Para especificar las reglas gramaticales tenemos que definir funciones en nuestro archivo yacc. La sintaxis del mismo es la siguiente: 

def function_name_here(symbol):
    expression = expression token_name term

Referencias:  
https://www.dabeaz.com/ply/ply.html
 

Publicación traducida automáticamente

Artículo escrito por nishkarsh146 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *