Pegjs: [Con. Req.] Invertir el proceso de análisis

Creado en 17 may. 2018  ·  13Comentarios  ·  Fuente: pegjs/pegjs

Tipo de problema

  • Informe de error: No
  • Solicitud de funciones:
  • Pregunta: si
  • No es un problema: No

Prerrequisitos

  • ¿Puedes reproducir el problema ?:
  • ¿Buscaste los problemas del repositorio ?:
  • ¿Revisaste los foros ?: ¿Qué foros?
  • ¿Realizó una búsqueda en la web (google, yahoo, etc.) ?: ¡Sí!

Descripción

Invertir el progreso del análisis sería increíble.

Comportamiento esperado:

Convertir un objeto en el formato que se analizó.

Comportamiento real:

Solo puedo analizar el formato, no convertir el objeto en el formato analizado.

discussion feature task

Comentario más útil

Hola. No entiendo el objetivo y el contexto (por qué) de su solicitud. Una muestra concreta podría ayudar.

El análisis reconoce una cadena como parte de un lenguaje y, opcionalmente, construye un AST o evalúa (interpreta) una expresión en la forma: parse(text) --> result
Esta función _parse () _, en general, no se garantiza que sea una función biyectiva. Por lo tanto, no hay garantía de que pueda revertir el análisis, ya que puede descartar detalles durante el análisis, por ejemplo.

Dado un AST, puede generar expresiones en texto correspondientes a un idioma. Esto se hace como parte de la generación de código y puede usar motores de plantilla para transformar AST en código fuente. Pero esta tarea está fuera del alcance de una biblioteca de análisis.

Todos 13 comentarios

Hola. No entiendo el objetivo y el contexto (por qué) de su solicitud. Una muestra concreta podría ayudar.

El análisis reconoce una cadena como parte de un lenguaje y, opcionalmente, construye un AST o evalúa (interpreta) una expresión en la forma: parse(text) --> result
Esta función _parse () _, en general, no se garantiza que sea una función biyectiva. Por lo tanto, no hay garantía de que pueda revertir el análisis, ya que puede descartar detalles durante el análisis, por ejemplo.

Dado un AST, puede generar expresiones en texto correspondientes a un idioma. Esto se hace como parte de la generación de código y puede usar motores de plantilla para transformar AST en código fuente. Pero esta tarea está fuera del alcance de una biblioteca de análisis.

Aunque personalmente, entiendo la sensación de querer que el software sea capaz de generar lo que puede analizar, como resumió @pjmolina , esto está fuera del alcance de esta biblioteca (generador de analizador), así que cerraré esto.

Le sugiero que cree su propio generador de código y utilice uno existente para el idioma que está analizando (tendrá que asegurarse de que el AST sea correcto).

Este boleto tiene mucho sentido. ¿Qué otra biblioteca esperaría convertir AST en código fuente dada la gramática en la sintaxis de PEG.js? Sí, actualmente no hay forma de hacerlo. La mayor parte del AST se genera en acciones y es imposible revertirlas. Pero cuando hay una sintaxis para la generación de AST de la que hablamos en un tema diferente, de repente no solo tiene sentido, sino que es posible implementarla.

StringTemplate , por ejemplo, es una de las muchas herramientas que puede usar para tal tarea: generación de código de AST.

No creo que StringTemplate lea gramáticas en la sintaxis PEG.js.

Contexto:

Para volver al texto original, un AST ( A bstract S yntax T ree) no sería suficiente. Por ejemplo, dada una gramática de JavaScript, estas dos declaraciones
normalmente tendría el mismo AST aunque su sintaxis sea ligeramente diferente,

// statement 1
var x = 5

// statement 2 - with semicolon
var x = 5;

Para poder volver al texto original, las acciones del analizador deben ser una función inyectiva .

Sugerencias:

Personalmente, no veo cómo una característica de este tipo puede ser parte de una biblioteca de análisis
que se basa en las acciones de los usuarios integrados para crear la estructura de salida.

Tal vez en el futuro si pegjs tuviera algún tipo de creación automática de Parse Tree
esto sería factible.

Construye tu propio

Suponiendo que dentro de las acciones integradas de pegjs, la información de posición completa está disponible
puede insertar sus propias acciones integradas personalizadas para construir un CST / ParseTree
y solo transformarlo en un AST en una fase de análisis posterior.
Una vez que tenga un CST, recrear la entrada original es bastante trivial ...

Evaluar una biblioteca de análisis con la creación automática de CST / Árbol de análisis

Puedes encontrar varios candidatos aquí:
https://tomassetti.me/parsing-in-javascript/

Decidí echar otro vistazo a esto, pero tendrá que ser posterior a la v1 antes de que se pueda implementar porque ese será el punto en el que la API sea estable y pueda lanzar un paquete que ofrezca una estructura AST común básica ( por ejemplo, @pegjs/ast ?). Los desarrolladores de analizadores sintácticos podrían usar este paquete para derivar su propio AST y, si es necesario, se puede usar para traducirlo a la fuente con otra herramienta (estoy pensando en @pegjs/reverse )

@futagoza ¿cómo te va con esto?

@ Coffee2CodeNL pegjs v1 aún no ha salido.

Tome este analizador de transformación SVG en PEGJS, por ejemplo: https://github.com/nidu/svg-transform-parser
Sería fantástico poder revertir el proceso y transformar el AST de nuevo en una cadena,
por lo que las transformaciones SVG se pueden modificar fácilmente, no solo analizar.
Una de esas herramientas que es similar es Augeas .

¿Alguien puede recomendar algunas herramientas para generar código desde AST?

@lzane ¿Qué AST?

@ polkovnikov-ph algunos AST personalizados generados por PEG

¿Existe alguna herramienta que lea la gramática PEG que pueda hacer el trabajo de generación de código?

¿Fue útil esta página
0 / 5 - 0 calificaciones