Hay muchos lenguajes de programación que tienen sus propias características únicas. Pero para que un programa escrito en cualquiera de ellos funcione, debe transmitirlo. A veces, los lenguajes de programación se desarrollan para sus propias necesidades (por ejemplo, soporte para la automatización en aplicaciones grandes) y luego se hace necesario escribir un traductor.
Necesario
- - gramática natural o BNF del idioma de origen;
- - herramientas de desarrollo.
Instrucciones
Paso 1
Preparar los datos para el análisis léxico del texto en el idioma de origen. Enumere todas las fichas en el idioma. Divídalos en categorías (palabras clave, literales numéricos y de cadena, identificadores, espacios en blanco, puntuación, etc.).
Paso 2
Implementar un módulo o lexer. En la entrada, debe recibir un flujo de datos "sin procesar", y en la salida formar una lista de elementos que contienen tokens y sus identificadores de tipo en la secuencia en la que aparecen en el texto fuente. El programa de análisis puede ser bastante simple " escáner de un nivel ". Implementar la recuperación de errores no tiene sentido. Los caracteres no válidos deben tratarse como errores.
Paso 3
Prepare los datos para analizar. Basándose en la gramática natural o BNF del idioma de origen, redacte su gramática LL1. Con base en este tipo de gramática, elabore un esquema de análisis en términos de las categorías de tokens válidos y construcciones semánticas del lenguaje.
Paso 4
Implemente un módulo o analizador. En la entrada, debería recibir una lista de tokens preparados en la etapa de análisis léxico. Desarrolle algoritmos de verificación de sintaxis recursivos utilizando el esquema que creó en el paso tres. Si es necesario, implemente mecanismos de recuperación de errores Agregue funcionalidad a los algoritmos de análisis para construir un árbol para calcular funciones, métodos de clase. Con la estructura correcta de algoritmos de análisis, esta funcionalidad se puede implementar sin ningún problema. Esto evita la necesidad de implementarlo como un módulo separado. Las estructuras de datos creadas deben contener listas de instrucciones en forma de secuencias "planas" (expresiones aritméticas expandidas en forma de sufijo adecuado para el cálculo en una máquina de pila, bucles convertidos en combinaciones de secuencias de instrucciones computacionales y saltos condicionales o incondicionales, etc.).
Paso 5
Cree un módulo de optimización si es necesario. Debe procesar y transformar las estructuras de datos preparadas en el paso anterior. Los métodos y algoritmos de optimización son muy diversos.
Paso 6
Desarrolle un generador de código. Al procesar las estructuras preparadas en el cuarto o quinto paso, simplemente debe transformar las secuencias de instrucciones abstractas en instrucciones para su ejecución en una plataforma específica.
Paso 7
Cree un programa de encuadernación (enlazador) si es necesario. Debe formar el módulo ejecutable resultante eligiendo la ubicación de los segmentos de código, calculando las direcciones de las etiquetas, etc.