Esto es parte de una serie de preguntas que se enfoca en el proyecto hermano del Proyecto Abstracción, que tiene como objetivo abstraer los conceptos utilizados en el diseño del lenguaje en forma de marco. El proyecto hermano se llama OILexer, que tiene como objetivo construir un analizador a partir de archivos de gramática, sin el uso de inyección de código en las coincidencias.
Algunas otras páginas asociadas a estas preguntas, relacionadas con la tipificación estructural, se pueden ver aquí , y la facilidad de uso se encuentra aquí . El metatema asociado a una consulta sobre el marco y el lugar adecuado para publicar se puede encontrar aquí .
Estoy llegando al punto en el que estoy a punto de comenzar a extraer el árbol de análisis de una gramática dada, seguido de un analizador de Descenso recursivo que usa DFA para discernir rutas hacia adelante (similar a LL (*) de ANTLR 4), así que pensé que lo abriría para obtener una idea.
En un compilador de analizador, ¿qué tipo de características son ideales?
Hasta ahora, aquí hay una breve descripción de lo que se implementa:
- Plantillas
- Mire hacia adelante la predicción, sabiendo lo que es válido en un punto dado.
- Regla 'Deliteralización' tomando los literales dentro de las reglas y resolviendo de qué token provienen.
- Autómatas no deterministas
- Autómatas deterministas
- Máquina de estado léxico simple para reconocimiento de tokens
- Métodos de automatización de tokens:
- Escaneo: útil para comentarios: Comentario: = "/ *" Escaneo ("* /");
- Restar: útil para identificadores: Identificador: = Restar (IdentifierBody, palabras clave);
- Asegura que el identificador no acepte palabras clave.
- Codificar: codifica una automatización como un recuento en serie X de transiciones de base N.
- UnicodeEscape: = "\\ u" BaseEncode (IdentifierCharNoEscape, 16, 4);
- Realiza un escape unicode en hexadecimal, con 4 transiciones hexadecimales. La diferencia entre esto y: [0-9A-Fa-f] {4} es que la automatización resultante con Encode limita el conjunto permitido de valores hexadecimales al alcance de IdentifierCharNoEscape. Entonces, si le das \ u005c, la versión de codificación no aceptará el valor. Cosas como esta tienen una advertencia seria: usar con moderación. La automatización resultante podría ser bastante compleja.
- UnicodeEscape: = "\\ u" BaseEncode (IdentifierCharNoEscape, 16, 4);
Lo que no se implementa es la generación CST, necesito ajustar las automatizaciones deterministas para llevar el contexto adecuado para que esto funcione.
Para cualquier persona interesada, he subido una bonita versión impresa de la forma original del proyecto T * y♯ . Cada archivo debe vincularse con todos los demás, comencé a vincular las reglas individuales para seguirlos, pero habría tardado demasiado (¡habría sido más sencillo de automatizar!)
Si se necesita más contexto, publique en consecuencia.
Editar 5-14-2013 : he escrito código para crear gráficos GraphViz para las máquinas de estado dentro de un idioma determinado. Aquí hay un gráfico de GraphViz del AssemblyPart . Los miembros vinculados en la descripción del idioma deben tener un rulename.txt en su carpeta relativa con el dígrafo de esa regla. Parte de la descripción del idioma ha cambiado desde que publiqué el ejemplo, esto se debe a simplificar las cosas sobre la gramática. Aquí hay una imagen gráfica interesante .