Lexer escrito en Javascript?


Tengo un proyecto en el que un usuario necesita definir un conjunto de instrucciones para una interfaz de usuario que esté completamente escrita en javascript. Necesito tener la habilidad de analizar una cadena de instrucciones y luego traducirlas en instrucciones. ¿Hay alguna librería para analizar que sea 100% javascript? ¿O un generador que generará en javascript? ¡Gracias!

Author: Phobis, 2009-12-01

10 answers

Algo así como http://jscc.phorward-software.com / , tal vez?

JS/CC es el primer sistema de desarrollo de parser disponible para JavaScript y ECMAScript-derivados. Se ha desarrollado, tanto con la intención de construir un sistema de desarrollo de compiladores productivo como con la intención de crear un entorno académico fácil de usar para las personas interesadas en cómo se realiza la generación de tablas de análisis en general en análisis de abajo hacia arriba.

El uniones de software independientes de la plataforma: Un analizador léxico basado en expresiones regulares un generador que empareja tokens individuales del flujo de caracteres de entrada y un generador LALR(1) parser, que calcula las tablas de análisis para una especificación dada de gramática libre de contexto y construye un analizador autónomo que funciona. La gramática libre de contexto alimentada a JS / CC está definida en un meta lenguaje basado en Backus-Naur-Form, y permite la inserción de código semántico individual a evaluar en la reducción de una regla.

JS / CC se ha escrito completamente en ECMAScript por lo que se puede ejecutar de muchas maneras diferentes: como JavaScript independiente de la plataforma, basado en el navegador incrustado en un sitio web, como una aplicación Host de Script de Windows, como un compilado JScript.NET ejecutable, como una aplicación interpretada por Mozilla / Rhino o Mozilla / Spidermonkey, o un script de shell V8 en Windows, *nix, Linux y Mac OSX. Sin embargo, para una ejecución productiva, se recomienda utilizar las versiones de línea de comandos. Estas versiones son capaces de ensamblar un compilador completo a partir de una especificación de analizador JS/CC, que luego se almacena en a .archivo fuente JavaScript js.

 22
Author: Stobor,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-10-31 13:19:35

Si desea construir analizadores JavaScript y generadores de código, echa un vistazo a la implementación de MetaII en Javascript.

Un tutorial de compilador de MetaII lo guía a través de la construcción de un sistema de compilador completamente autónomo que puede traducirse a sí mismo y a otros idiomas:

Tutorial del compilador de MetaII

Todo esto está basado en un increíble documento técnico de 10 páginas de Val Schorre: META II: A Syntax-Oriented Compiler Writing Language from honest-to-god 1964. El La auto-descripción completa del compilador de MetaII es de aproximadamente 30 líneas! Aprendí a construir compiladores de esto en 1970. Hay un momento alucinante cuando finalmente grok cómo el compilador puede regenerarse a sí mismo....

El tutorial explica MetaII, cómo funciona, e implementa MetaII compilando MetaII en JavaScript. Puede modificar fácilmente este compilador para analizar otros idiomas, y producir diferentes Javascript.

Conozco al autor del sitio web desde mis días universitarios, pero no tengo nada que ver con el sitio web.

 13
Author: Ira Baxter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-12-01 06:29:20

Jison es probablemente el mejor y más activo generador de lexer y parser para Javascript. Imita al bisonte y al Yacc.

Jison: http://zaach.github.io/jison /

Si solo quieres un lexer ligero (~100 sloc) puedes echar un vistazo a Lexed.js: https://github.com/tantaman/lexed.js

 6
Author: Matt Crinklaw-Vogt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-04-27 23:27:37

Para tareas de análisis simples, soy bastante aficionado a usar una variante del analizador de Precedencia del Operador de Pratt de arriba hacia abajo. Mientras que Pratt escribió el artículo original usando un antiguo dialecto Lisp, los mismos conceptos se pueden usar fácilmente en casi cualquier idioma. De hecho, Douglas Crockford escribió un excelente artículo sobre La precedencia del operador de arriba hacia abajo que analiza en JavaScript, que podría ser justo lo que necesita.

 4
Author: bcat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-12-01 03:27:47

Aquí hay un ejemplo de un analizador para un" pseudo " lenguaje natural de instrucciones, que se implementó en pure JavaScript con Chevrotain Analizando DSL :

Https://github.com/SAP/chevrotain/blob/master/examples/parser/inheritance/inheritance.js

Este ejemplo incluso incluye soporte para múltiples lenguajes naturales (inglés y alemán) usando herencia gramatical.

Chevrotain cae bajo la categoría de "bibliotecas por ahí para el análisis que son 100% javascript " ya que realiza no hay generación de código. Usar Chevrotain es similar a "hand crafting" un analizador recursivo decente, solo que sin la mayor parte del dolor de cabeza como:

  • Creación de la función Lookahead (decidir qué alternativa tomar)
  • Recuperación Automática de Errores.
  • Detección de recursión izquierda
  • Detección de ambigüedad.
  • Posición información.
  • ...

Como Chevrotain maneja eso automáticamente.

 2
Author: bd82,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-07-13 22:56:59

Dependiendo del diseño del 'conjunto de instrucciones', puede ser capaz de usar la función incorporada de Javascript eval, que analiza el código fuente de Javascript; puede ser capaz de escribir un traductor simple para convertir las instrucciones en código Javascript.

Por cierto, tenga mucho cuidado con los agujeros XSS.

 1
Author: SLaks,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-12-01 02:22:04

Si realmente estás buscando solo un lexer, prueba prettify.

 1
Author: Naveen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-05-17 06:26:22

Si quieres un lexer y nada más que un lexer entonces echa un vistazo a esto: https://github.com/aaditmshah/lexer

Es un lexer JavaScript puro con muchas características poderosas escritas en solo unas pocas líneas de código.

 1
Author: Aadit M Shah,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-01-23 16:05:03

Antlr versión 4.5 ahora tiene un destino Javascript .

 1
Author: mounds,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-08-11 00:43:35

Estaba buscando algo similar que no tuviera ningún agujero de seguridad y me encontré con dos recursos. No analizan el script, sino que lo ejecutan en un entorno "seguro", algo que no se puede garantizar cuando se usa la función eval. Por lo tanto, no se si es exactamente lo que estás buscando, pero echa un vistazo:

  1. jsandbox - Javascript sandbox
  2. Caja de Google - iframe virtual.
 0
Author: Mottie,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-12-01 02:56:43