Compilador-compilador

format_list_bulleted Contenido keyboard_arrow_down
ImprimirCitar
Programa que genera paresers o compiladores

En informática, un compilador-compilador o generador de compiladores es una herramienta de programación que crea un analizador, intérprete o compilador a partir de alguna forma de descripción formal de una programación. lenguaje y máquina.

El tipo más común de compilador-compilador se llama más precisamente un generador de analizador. Solo maneja el análisis sintáctico.

La entrada de un generador de analizador es un archivo de gramática, normalmente escrito en formato Backus-Naur (BNF) o formato Backus-Naur extendido (EBNF) que define la sintaxis de un lenguaje de programación de destino.

La salida es el código fuente de un analizador para el lenguaje de programación. La salida del código fuente del analizador (compilado) es un analizador. Puede ser independiente o integrado. Este analizador toma como entrada el código fuente del lenguaje de programación de destino y realiza alguna acción o genera un árbol de sintaxis abstracta (AST).

Los generadores de analizadores no manejan la semántica del AST ni la generación de código de máquina para la máquina de destino.

Un metacompilador es una herramienta de desarrollo de software utilizada principalmente en la construcción de compiladores, traductores e intérpretes para otros lenguajes de programación. La entrada a un metacompilador es un programa de computadora escrito en un metalenguaje de programación especializado diseñado principalmente con el propósito de construir compiladores. El lenguaje del compilador producido se llama lenguaje objeto. La entrada mínima que produce un compilador es un metaprograma que especifica la gramática del lenguaje objeto y las transformaciones semánticas en un programa objeto.

Variantes

Un generador de analizador típico asocia el código ejecutable con cada una de las reglas de la gramática que deben ejecutarse cuando el analizador aplica estas reglas. Estas piezas de código a veces se denominan rutinas de acción semántica, ya que definen la semántica de la estructura sintáctica que analiza el analizador. Según el tipo de analizador que deba generarse, estas rutinas pueden construir un árbol de análisis (o un árbol de sintaxis abstracta) o generar código ejecutable directamente.

Una de las versiones más antiguas (1964), sorprendentemente poderosas, de compiladores-compiladores es META II, que aceptaba una gramática analítica con funciones de salida que producían código de máquina de pila y podía compilar su propio código fuente y otros lenguajes.

Entre los primeros programas de las versiones originales de Unix que se construyeron en Bell Labs se encontraba el sistema de dos partes lex y yacc, que normalmente se usaba para generar código de lenguaje de programación C, pero tenía un sistema de salida flexible que podía usarse para todo. desde lenguajes de programación hasta conversión de archivos de texto. Sus versiones modernas de GNU son flex y bison.

Algunos compiladores-compiladores experimentales toman como entrada una descripción formal de la semántica del lenguaje de programación, generalmente usando semántica denotacional. Este enfoque a menudo se denomina 'compilación basada en la semántica', y fue iniciado por Peter Mosses'. Sistema de Implementación Semántica (SIS) en 1978. Sin embargo, tanto el compilador generado como el código que producía eran ineficientes en tiempo y espacio. Actualmente no se construyen compiladores de producción de esta manera, pero la investigación continúa.

El proyecto Production Quality Compiler-Compiler (PQCC) de la Universidad Carnegie Mellon no formaliza la semántica, pero tiene un marco semiformal para la descripción de máquinas.

Los compiladores-compiladores existen de muchas formas, incluidos los generadores de máquinas de reescritura de abajo hacia arriba (ver JBurg) que se usan para organizar árboles de sintaxis de acuerdo con una gramática de reescritura para la generación de código y los generadores de analizadores de gramática de atributos (p. ej., ANTLR se puede usar para tipos simultáneos verificación, propagación constante y más durante la etapa de análisis).

Metacompiladores

Los metacompiladores reducen la tarea de escribir compiladores automatizando los aspectos que son los mismos independientemente del lenguaje objeto. Esto hace posible el diseño de idiomas específicos de dominio que sean apropiados para la especificación de un problema particular. Un metacompilador reduce el costo de producir traductores para estos lenguajes de objeto específicos de dominio a un punto en el que se hace económicamente factible incluir en la solución de un problema un diseño de lenguaje específico de dominio.

Como el metalenguaje de un metacompilador suele ser un poderoso lenguaje de procesamiento de cadenas y símbolos, a menudo tienen aplicaciones sólidas para aplicaciones de propósito general, incluida la generación de una amplia gama de otras herramientas de análisis e ingeniería de software.

Además de ser útil para el desarrollo de lenguajes específicos de dominio, un metacompilador es un excelente ejemplo de un lenguaje específico de dominio, diseñado para el dominio de la escritura de compiladores.

Un metacompilador es un metaprograma normalmente escrito en su propio metalenguaje o en un lenguaje de programación informático existente. El proceso de compilación de un metacompilador, escrito en su propio metalenguaje, es equivalente al compilador autohospedado. Los compiladores más comunes escritos hoy en día son compiladores de alojamiento propio. El alojamiento propio es una herramienta poderosa de muchos metacompiladores, que permite la fácil extensión de su propio metalenguaje de metaprogramación. La característica que diferencia a un metacompilador de otros compiladores es que toma como entrada un lenguaje de metaprogramación especializado que describe todos los aspectos del funcionamiento del compilador. Un metaprograma producido por un metacompilador es un programa tan completo como un programa escrito en C++, BASIC o cualquier otro lenguaje de programación general. El metalenguaje de metaprogramación es un atributo poderoso que permite un desarrollo más fácil de lenguajes de programación de computadoras y otras herramientas informáticas. Los procesadores de línea de comandos, la transformación y el análisis de cadenas de texto se codifican fácilmente usando metalenguajes de metaprogramación de metacompiladores.

Un paquete de desarrollo completo incluye un enlazador y una biblioteca de soporte en tiempo de ejecución. Por lo general, se necesita un lenguaje de programación de sistemas orientado a máquina, como C o C++, para escribir la biblioteca de soporte. Una biblioteca que consta de las funciones de soporte necesarias para el proceso de compilación generalmente completa el paquete completo del metacompilador.

El significado de metacompilador

En informática, el prefijo meta se usa comúnmente para significar sobre (su propia categoría). Por ejemplo, los metadatos son datos que describen otros datos. Un lenguaje que se utiliza para describir otros lenguajes es un metalenguaje. Meta también puede significar en un nivel más alto de abstracción. Un metalenguaje opera en un nivel superior de abstracción para describir las propiedades de un lenguaje. La forma Backus-Naur (BNF) es un metalenguaje formal utilizado originalmente para definir ALGOL 60. BNF es un metalenguaje débil, ya que describe solo la sintaxis y no dice nada sobre la semántica o el significado. La metaprogramación es la escritura de programas de computadora con la capacidad de tratar los programas como sus datos. Un metacompilador toma como entrada un metaprograma escrito en un metalenguaje especializado (una abstracción de nivel superior) diseñado específicamente para el propósito de la metaprogramación. La salida es un programa objeto ejecutable.

Se puede trazar una analogía: como un compilador C++ toma como entrada un programa de lenguaje de programación C++, un metacompilador toma como entrada un programa de metalenguaje de metaprogramación.

Cuarto metacompilador

Muchos defensores del lenguaje Forth llaman metacompilación al proceso de creación de una nueva implementación de Forth y constituyen un metacompilador. La cuarta definición de metacompilador es:

"Un metacompilador es un compilador que procesa su propio código fuente, dando lugar a una versión ejecutable de sí mismo."

Este cuarto uso del término metacompilador está en disputa en la informática convencional. Consulte Forth (lenguaje de programación) e Historia de la construcción del compilador. El proceso Forth real de compilación en sí mismo es una combinación de un Forth que es un lenguaje de programación extensible autohospedado y, a veces, compilación cruzada, terminología establecida desde hace mucho tiempo en informática. Los metacompiladores son un sistema general de escritura de compiladores. Además, el concepto de metacompilador de Forth es indistinguible del lenguaje autohospedado y extensible. El proceso real actúa en un nivel inferior definiendo un subconjunto mínimo de palabras forth, que se pueden usar para definir palabras adicionales. Luego se puede definir una implementación completa de Forth a partir del conjunto base. Esto suena como un proceso de arranque. El problema es que casi todos los compiladores de lenguaje de propósito general también se ajustan a la descripción del metacompilador Forth.

Cuando (auto-anfitrión compilador) X procesa su propio código fuente, resultando en una versión ejecutable de sí mismo, X es un metacompilador.

Simplemente reemplace X con cualquier lenguaje común, C, C++, Pascal, COBOL, Fortran, Ada, Modula-2, etc. Y X sería un metacompilador según el uso de Forth de metacompilador. Un metacompilador opera en un nivel de abstracción por encima del compilador que compila. Solo opera en el mismo nivel (compilador de alojamiento propio) cuando se compila a sí mismo. Uno tiene que ver el problema con esta definición de metacompilador. Se puede aplicar a casi cualquier idioma.

Sin embargo, al examinar el concepto de programación en Forth, agregar nuevas palabras al diccionario, extender el lenguaje de esta manera es metaprogramación. Es esta metaprogramación en Forth lo que lo convierte en un metacompilador.

Programar en Forth es agregar nuevas palabras al idioma. Cambiar el idioma de esta manera es metaprogramación. Forth es un metacompilador porque Forth es un lenguaje diseñado específicamente para la metaprogramación. Programar en Forth es extender Forth, agregar palabras al vocabulario de Forth crea un nuevo dialecto de Forth. Forth es un metacompilador especializado para los dialectos del idioma Forth.

Historia

El primer compilador-compilador que usó ese nombre fue escrito por Tony Brooker en 1960 y se usó para crear compiladores para la computadora Atlas en la Universidad de Manchester, incluido el compilador Atlas Autocode.

La historia temprana de los metacompiladores está estrechamente relacionada con la historia del grupo de trabajo 1 de SIG/PLAN sobre compiladores controlados por sintaxis. El grupo se inició principalmente a través del esfuerzo de Howard Metcalfe en el área de Los Ángeles. En el otoño de 1962, Howard Metcalfe diseñó dos intérpretes de escritura de compiladores. Uno utilizó una técnica de análisis de abajo hacia arriba basada en un método descrito por Ledley y Wilson. El otro usó un enfoque de arriba hacia abajo basado en un trabajo de Glennie para generar oraciones aleatorias en inglés a partir de una gramática libre de contexto.

Al mismo tiempo, Val Schorre describió dos "meta máquinas", una generativa y otra analítica. Se implementó la máquina generativa y se produjeron expresiones algebraicas aleatorias. Schorre implementó Meta I, el primer metacompilador, en un IBM 1401 en UCLA en enero de 1963. Sus intérpretes y metamáquinas originales se escribieron directamente en un lenguaje pseudomáquina. META II, sin embargo, fue escrito en un metalenguaje de alto nivel capaz de describir su propia compilación en el lenguaje pseudo-máquina.

Lee Schmidt de Bolt, Beranek y Newman escribió un metacompilador en marzo de 1963 que utilizaba una pantalla CRT en el PDP-l de tiempo compartido. Este compilador produjo código de máquina real en lugar de código interpretativo y se arrancó parcialmente de Meta I.

Schorre arrancó Meta II de Meta I durante la primavera de 1963. El documento sobre el sistema metacompilador refinado presentado en la conferencia ACM de Filadelfia de 1964 es el primer documento sobre un metacompilador disponible como referencia general. La sintaxis y la técnica de implementación del sistema de Schorre sentaron las bases para la mayoría de los sistemas que siguieron. El sistema se implementó en un pequeño 1401 y se utilizó para implementar un lenguaje pequeño similar a ALGOL.

Muchos sistemas similares siguieron inmediatamente.

Roger Rutman de AC Delco desarrolló e implementó LOGIK, un lenguaje para simulación de diseño lógico, en el IBM 7090 en enero de 1964. Este compilador usó un algoritmo que produjo código eficiente para expresiones booleanas.

Otro artículo en las actas de ACM de 1964 describe Meta III, desarrollado por Schneider y Johnson en UCLA para IBM 7090. Meta III representa un intento de producir código de máquina eficiente para una gran clase de lenguajes. Meta III se implementó completamente en lenguaje ensamblador. Se escribieron dos compiladores en Meta III, CODOL, un compilador de demostración de escritura de compiladores, y PUREGOL, un dialecto de ALGOL 60. (Fue puro descaro llamarlo ALGOL).

A finales de 1964, Lee Schmidt arrancó el metacompilador EQGEN, desde el PDP-l hasta el Beckman 420. EQGEN era un lenguaje de generación de ecuaciones lógicas.

En 1964, System Development Corporation inició un gran esfuerzo en el desarrollo de metacompiladores. Este esfuerzo incluye poderosos metacompiladores, Bookl y Book2 escritos en Lisp que tienen una amplia capacidad de búsqueda de árboles y copias de seguridad. Una consecuencia de uno de los sistemas Q-32 en SDC es Meta 5. El sistema Meta 5 incorpora una copia de seguridad del flujo de entrada y suficientes otras instalaciones para analizar cualquier lenguaje sensible al contexto. Este sistema se lanzó con éxito a una gran cantidad de usuarios y tenía muchas aplicaciones de manipulación de cadenas además de la compilación. Tiene muchas pilas push-down elaboradas, configuración de atributos y facilidades de prueba, y mecanismos de salida. Que Meta 5 traduzca con éxito programas JOVIAL a programas PL/I demuestra su potencia y flexibilidad.

Robert McClure de Texas Instruments inventó un compilador llamado TMG (presentado en 1965). TMG se utilizó para crear los primeros compiladores para lenguajes de programación como B, PL/I y ALTRAN. Junto con el metacompilador de Val Schorre, fue una de las primeras inspiraciones para el último capítulo de El arte de la programación informática de Donald Knuth.

El sistema LOT se desarrolló durante 1966 en el Instituto de Investigación de Stanford y se modeló muy de cerca a Meta II. Tenía nuevas construcciones de propósito especial que le permitían generar un compilador que, a su vez, podía compilar un subconjunto de PL/I. Este sistema tenía amplias instalaciones de recopilación de estadísticas y se utilizó para estudiar las características del análisis de arriba hacia abajo.

SIMPLE es un sistema traductor especializado diseñado para ayudar en la escritura de preprocesadores para PL/I, SIMPLE, escrito en PL/I, está compuesto por tres componentes: un ejecutivo, un analizador de sintaxis y un constructor semántico.

El compilador TREE-META se desarrolló en el Instituto de Investigación de Stanford en Menlo Park, California. Abril de 1968. La historia de los primeros metacompiladores está bien documentada en el manual TREE META. TREE META fue paralelo a algunos de los desarrollos de SDC. A diferencia de los metacompiladores anteriores, separó el procesamiento de la semántica del procesamiento de la sintaxis. Las reglas de sintaxis contenían operaciones de creación de árboles que combinaban elementos de lenguaje reconocidos con nodos de árboles. Luego, la representación de la estructura de árbol de la entrada se procesó mediante una forma simple de reglas de análisis. Las reglas de unparse usaban reconocimiento de nodos y pruebas de atributos que, cuando coincidían, daban como resultado que se realizara la acción asociada. Además, el elemento de árbol similar también podría probarse en una regla de análisis. Las reglas de Unparse también eran un lenguaje recursivo que podía llamar a las reglas de Unparse que pasaban elementos del árbol antes de que se realizara la acción de la regla de Unparse.

El concepto de metamáquina propuesto originalmente por Glennie es tan simple que se diseñaron tres versiones de hardware y una se implementó. Este último en la Universidad de Washington en St. Louis. Esta máquina fue construida a partir de componentes macro-modulares y tiene como instrucciones los códigos descritos por Schorre.

CWIC (Compilador para escribir e implementar compiladores) es el último metacompilador Schorre conocido. Fue desarrollado en Systems Development Corporation por Erwin Book, Dewey Val Schorre y Steven J. Sherman. Con todo el poder de (lisp 2) un lenguaje de procesamiento de listas, los algoritmos de optimización podrían operar en listas y árboles generados por sintaxis antes de la generación de código. CWIC también tenía una tabla de símbolos integrada en el lenguaje.

Con el resurgimiento de los lenguajes específicos de dominio y la necesidad de generadores de analizadores que sean fáciles de usar, comprender y mantener, los metacompiladores se están convirtiendo en una herramienta valiosa para proyectos avanzados de ingeniería de software.

Otros ejemplos de generadores de analizadores del estilo yacc son ANTLR, Coco/R, CUP, GNU Bison, Eli, FSL, SableCC, SID (Syntax Improving Device) y JavaCC. Si bien son útiles, los generadores de analizadores puros solo abordan la parte de análisis del problema de construir un compilador. Las herramientas con un alcance más amplio, como PQCC, Coco/R y DMS Software Reengineering Toolkit, brindan un apoyo considerable para las actividades posteriores al análisis más difíciles, como el análisis semántico, la optimización y la generación de código.

Metalenguajes de Schorre

Los primeros metacompiladores Schorre, META I y META II, fueron desarrollados por D. Val Schorre en UCLA. Le siguieron otros metacompiladores basados en Schorre. Cada uno agrega mejoras al análisis de lenguaje y/o generación de código.

En programación es común usar el nombre del lenguaje de programación para referirse tanto al compilador como al lenguaje de programación, el contexto distingue el significado. Un programa en C++ se compila utilizando un compilador de C++. Eso también se aplica en lo siguiente. Por ejemplo, META II es tanto el compilador como el lenguaje.

Los metalenguajes de la línea Schorre de metacompiladores son lenguajes de programación funcionales que utilizan ecuaciones de sintaxis de análisis de gramática de arriba hacia abajo que tienen construcciones de transformación de salida integradas.

Una ecuación de sintaxis:

- Nombramiento de propiedad =

es una función compilada de prueba que devuelve éxito o fallo. <nombre> es el nombre de la función. <cuerpo> es una forma de expresión lógica que consiste en pruebas que pueden agruparse, tener alternativas y producciones de salida. Una prueba es como un bool en otros idiomas, siendo éxito verdadero y fracaso siendo falso.

Definir un lenguaje de programación analíticamente de arriba hacia abajo es natural. Por ejemplo, un programa podría definirse como:

 programa = $declaration;

Definir un programa como una secuencia de cero o más declaraciones.

En los idiomas Schorre META X existe una regla de conducción. La regla del programa anterior es un ejemplo de una regla de conducción. La regla del programa es una función de prueba que llama a la declaración, una regla de prueba que devuelve éxito o fracaso. El operador de bucle $ llama repetidamente a la declaración hasta que se devuelve fallo. El operador $ siempre tiene éxito, incluso cuando hay una declaración de cero. El programa anterior siempre devolvería el éxito. (En CWIC, una falla prolongada puede pasar por alto la declaración. Una falla prolongada es parte del sistema de seguimiento de CWIC)

Los juegos de caracteres de estos primeros compiladores eran limitados. El carácter / se utilizó para el operador alternativo (o). "A o B" se escribe como A/B. Los paréntesis () se utilizan para agrupar.

A (B/C)

Describe una construcción de A seguida de B o C. Como expresión booleana sería

A y (B) o C)

Una secuencia X Y tiene un significado implícito de X y Y. () están agrupando y / el operador o. El orden de evaluación siempre es de izquierda a derecha, ya que el orden de las pruebas especifica una secuencia de caracteres de entrada.

Palabras de operadores especiales cuyo primer carácter es "." se usan para mayor claridad..EMPTY se usa como la última alternativa cuando no es necesario que esté presente una alternativa anterior.

X (A / B /.EMPTY)

Indica que X es seguido opcionalmente por A o B. Esta es una característica específica de estos metalenguajes que son lenguajes de programación. Lo anterior evita el retroceso. Otros sistemas constructores de compiladores pueden haber declarado las tres secuencias posibles y dejar que el analizador lo descubra.

Las características de los metalenguajes de metaprogramación anteriores son comunes a todos los metacompiladores de Schorre y los derivados de ellos.

META I

META I era un metacompilador compilado a mano que se usaba para compilar META II. Poco más se sabe de META I excepto que la compilación inicial de META II produjo un código casi idéntico al del compilador META I codificado a mano.

METAII

Cada regla consta opcionalmente de pruebas, operadores y producciones de salida. Una regla intenta hacer coincidir alguna parte del flujo de caracteres de origen del programa de entrada que devuelve éxito o fracaso. En caso de éxito, la entrada avanza sobre los caracteres coincidentes. En caso de fallo, la entrada no avanza.

Las producciones de salida generaron una forma de código ensamblador directamente desde una regla de sintaxis.

ÁRBOL-META

TREE-META introdujo operadores de construcción de árboles :<node_name> y [<number>] moviendo las transformaciones de producción de salida a reglas sin analizar. Los operadores de construcción de árboles se utilizaron en las reglas gramaticales transformando directamente la entrada en un árbol de sintaxis abstracta. Las reglas de Unparse también son funciones de prueba que coinciden con patrones de árbol. Las reglas de Unparse se llaman desde una regla gramatical cuando un árbol de sintaxis abstracta se va a transformar en código de salida. La construcción de un árbol de sintaxis abstracta y reglas de análisis permitió realizar optimizaciones locales mediante el análisis del árbol de análisis.

El traslado de las producciones de salida a las reglas de unparse hizo una separación clara entre el análisis de gramática y la producción de código. Esto hizo que la programación fuera más fácil de leer y comprender.

CWIC

En 1968–1970, Erwin Book, Dewey Val Schorre y Steven J. Sherman desarrollaron CWIC. (Compilador para escribir e implementar compiladores) en System Development Corporation Charles Babbage Institute Center for the History of Information Technology (Cuadro 12, carpeta 21),

CWIC es un sistema de desarrollo de compiladores compuesto por tres lenguajes de propósito especial y de dominio específico, cada uno de los cuales tiene la intención de permitir la descripción de ciertos aspectos de la traducción de manera directa. El lenguaje de sintaxis se utiliza para describir el reconocimiento del texto fuente y la construcción a partir de él en una estructura de árbol intermedia. El lenguaje del generador se usa para describir la transformación del árbol en el lenguaje objeto apropiado.

El lenguaje de sintaxis sigue la línea anterior de metacompiladores de Dewey Val Schorre. Se parece más a TREE-META que tiene operadores de construcción de árboles en el lenguaje de sintaxis. Las reglas de análisis de TREE-META se amplían para trabajar con el lenguaje generador basado en objetos basado en LISP 2.

CWIC incluye tres idiomas:

  • Sintaxis: Transforma la entrada del programa fuente, en estructuras de lista usando fórmula de transformación gramática. Una estructura de expresión parsed se transmite a un generador mediante la colocación de una llamada de generador en una regla. Un árbol está representado por una lista cuyo primer elemento es un objeto nodo. El idioma tiene operadores, . y , específicamente para hacer listas. El colon : operador se utiliza para crear objetos de nodo. :ADD crea un nodo ADD. La exclamación ! operador combina una serie de entradas persianas con un nodo para hacer un árbol. Los árboles creados por reglas de sintaxis se transmiten a las funciones generadoras, el éxito o el fracaso retornados. El lenguaje de sintaxis está muy cerca de TREE-META. Ambos usan un colon para crear un nodo. Exclamación de la construcción de árboles de CWIC!Seguridad número ejerce las mismas funciones que las de TREE-META [ Nombramiento].
  • Generador: una serie nombrada de reglas de transformación, cada una consistente en un patrón inigualable, que coincide, regla. y una producción de salida escrita en un lenguaje LISP 2. la traducción fue al código binario IBM 360. Otras instalaciones del lenguaje generador generalizaron la producción.
  • MOL-360: un lenguaje independiente de aplicación de nivel medio para la familia de computadoras IBM System/360 desarrollado en 1968 y utilizado para escribir la biblioteca de apoyo subyacente.

Idioma de los generadores

Generators Language tenía una semántica similar a Lisp. El árbol de análisis se pensó como una lista recursiva. La forma general de una función de lenguaje generador es:

 función-nombre(primer-unparse_rule) = propiedad first-production_code_generator
(segundo-unparse_rule) = segunda producción_code_generator
(third-unparse_rule) = tercer producto_code_generator
...

El código para procesar un árbol determinado incluía las características de un lenguaje de programación de propósito general, además de un formulario: <cosas>, que emitiría (cosas) en el archivo de salida. Se puede usar una llamada de generador en unparse_rule. Al generador se le pasa el elemento del patrón unparse_rule en el que se coloca y sus valores de retorno se enumeran en (). Por ejemplo:

 expr_gen(ADD[expr_gen(x),expr_gen(y)]) =
(x*16)+y;
releasereg(y);
retorno x;
(SUB[expr_gen(x),expr_gen(y)]
(x*16)+y;
releasereg(y);
retorno x;
(MUL[expr_gen(x),expr_gen(y)]
.
.
.
x)= título r1 = getreg();
load(r1, x);
retorno r1;
...

Es decir, si el árbol de análisis se parece a (ADD[<algo1>,<algo2>]), expr_gen(x) se llamaría con <algo1> y devuelve x. Una variable en la regla sin analizar es una variable local que se puede usar en production_code_generator. expr_gen(y) se llama con <algo2> y devuelve y. Aquí hay una llamada de generador en una regla de desanálisis se pasa el elemento en la posición que ocupa. Esperemos que en la xey anterior se registren al regresar. La última transformación está destinada a cargar un atómico en un registro y devolver el registro. La primera producción se utilizaría para generar el 360 "AR" Instrucción (Add Register) con los valores apropiados en registros generales. El ejemplo anterior es solo una parte de un generador. Cada expresión del generador se evalúa como un valor que luego se puede procesar. La última transformación también podría haberse escrito como:

 x)= " Volver load(getreg(), x);

En este caso, load devuelve su primer parámetro, el registro devuelto por getreg(). las funciones load y getreg son otros generadores de CWIC.

CWIC abordó los idiomas específicos del dominio antes de que existiera el término idioma específico del dominio

De los autores de CWIC:

"Un metacompilador ayuda en la tarea de creación de compiladores mediante la automatización de sus aspectos no creativos, aquellos aspectos que son los mismos independientemente del idioma que el compilador producido va a traducir. Esto hace posible el diseño de lenguajes adecuados a la especificación de un problema particular. Reduce el costo de producción de procesadores para dichos lenguajes hasta el punto en que se vuelve económicamente factible comenzar la solución de un problema con el diseño del lenguaje."

Ejemplos

  • ANTLR
  • BNFC
  • GNU Bison
  • Coco/R, Coco-2
  • DMS Software Reengineering Toolkit, un sistema de transformación del programa con generadores de parser
  • Epsilon Grammar Studio
  • Generador de analizador de limón
  • LRStar: generador de parser LR(*)
  • META II
  • parboiled, una biblioteca de Java para edificios de persianas.
  • Packrat parser
  • PackCC, un analizador de paquetes con soporte de recursión izquierda.
  • PQCC, un compilador-compilador que es más que un generador de parser.
  • Dispositivo de mejora de la sintaxis (SID)
  • SYNTAX, un conjunto de herramientas integrado para la construcción de compiladores.
  • TREE-META
  • Yacc
  • Xtext
  • XPL
  • JavaCC

Referencias y notas

  1. ^ "A Syntax Directed Compiler for ALGOL 60" Edgar T. Irons, Communications of the ACM Volume 4 Issue 1, ene. 1961.
  2. ^ a b Metacompilador: ()informática) Un compilador que se utiliza principalmente para construir compiladores para otros idiomas de programación."Diccionario de Ciencia y Tecnología McGraw-Hill Dictionary, 6a edición". McGraw-Hill Companies. Archivado desde el original en 2018-04-07. Retrieved 2018-04-07.
  3. ^ a b c d e f g h Libro, Erwin; Dewey Val Schorre; Steven J. Sherman (junio de 1970). "El sistema CWIC/36O, un compilador para escribir e implementar compiladores". ACM SIGPLAN Avisos. 5 (6): 11–29. doi:10.1145/954344.954345. S2CID 44675240.
  4. ^ a b C. Stephen Carr, David A. Luther, Sherian Erdmann, El sistema de compilador-compilador TREE-META: un sistema de compilador de meta para el Univac 1108 y General Electric 645, University of Utah Technical Report RADC-TR-69-83.
  5. ^ Peter Mosses, "SIS: A Compiler-Generator System using Denotational Semantics", Report 78-4-3, Dept. of Computer Science, University of Aarhus, Denmark, June 1978
  6. ^ Vecinos, J. M. Software Construction usando Componentes Archivados 2018-03-18 en el Wayback Machine. Technical Report 160, Department of Information and Computer Sciences, University of California, Irvine, 1980.
  7. ^ Howard Metcalfe, "A Parameterized Compiler Based on Mechanical Linguistics" Planning Research Corporation R-311, 1 March 1963, también en Annual Review in Automatic Programming, Vol. 4
  8. ^ Robert Ledley y J. B. Wilson, "Automatic Programming, Language Translation Through Syntactical Analysis", Communications of the Association for Computing Machinery, Vol. 5, No. 3 pp. 145-155, marzo 1962.
  9. ^ A. E. Glennie, "On the Syntax Machine and the Construction of a Universal Computer", Informe técnico número 2, AD 240–512, Centro de Computación, Carnegie Institute of Technology, 1960.
  10. ^ Schorre, D. V., META II un lenguaje compilador orientado a la sintaxis, Proceedings of the 1964 19th ACM National Conference, pp. 41.301-41.3011, 1964
  11. ^ Dewey, Val Schorre (1963). "Un sintaxis: SMALGOL dirigido para el 1401". ACM National Conference, Denver, Colorado.
  12. ^ Meta Me describen en el documento dado en la conferencia de 1963 Colorado ACM. Véase SMALGOL.
  13. ^ L. O. Schmidt, "The Status Bitt ACM SegPlan "Special Interest Group on Programming Languages" Working Group 1 News Letter, 1964.
  14. ^ Roger Rutman, "LOGIK. Compilador Directo Sintaxis para la simulación de Bit-Time de Computadora", tesis maestra, UCLA, agosto de 1964.
  15. ^ F. W. Schneider y (G. D. Johnson, "A Syntax-Directed Compiler-writing, Compiler to generate Efficient Code", Proceedings of the 19th National Conference of the Association for Computing Machinery, 1964
  16. ^ D. Oppenheim y D. Haggerty, "META 5: A Tool to Manipulate Strings of Data", Proceedings of the 21st National Conference of the Association for Computing Machinery, 1966.
  17. ^ Knuth, Donald (1990). P. Deransart; M. Jourdan (eds.). "El Génesis de Atributo Grammars" (PDF). Proceedings of the International Conference on Attribute Grammars and Their Applications (París, Francia). Notas de conferencia en Ciencias de la Computación. Nueva York: Springer-Verlag. 461: 1–12. CiteSeerX10.1.1.105.5365. doi:10.1007/3-540-53101-7_1. ISBN 978-3-540-53101-2. Archivado (PDF) original el 2020-11-23. Retrieved 2020-02-06.
  18. ^ Charles R. Kirkley y Johns F. Rulifson, "The LOT System of Syntax Directed Compiling", Stanford Research Institute Internal Report ISR 187531-139, 1966.
  19. ^ George J. E. (1967a). Syntax Analyzer, Reconocer, Parser y Sistema de Interpretación Semántica, Stanford Linear Accelerator Center, 15 de noviembre de 1967.
  20. ^ a b Rechenberg, Peter [en alemán]Mössenböck, Hanspeter [en alemán] (1985). Ein Compiler-Generator für Mikrocomputer - Grundlagen, Anwendungen, Programmierung in Modula-2 (en alemán) (1 ed.). Munich, Alemania: Carl Hanser Verlag. ISBN 3-446-14495-1. (NB. El libro describe la construcción de Coco en Modula-2.)
  21. ^ Robert W. Gray et al., "Eli: Un sistema de construcción compilador completo y flexible". Comunicaciones de la ACM 35:2:121-130, 1992; véase también http://eli.colorado.edu/ Archivado 28 marzo 2019 en la máquina Wayback
  22. ^ J. M. Foster, "Un programa de mejora de sintaxis archivado 2022-05-10 en la máquina Wayback". The Computer Journal 11:1:31-34, 1968
Más resultados...
Tamaño del texto:
undoredo
format_boldformat_italicformat_underlinedstrikethrough_ssuperscriptsubscriptlink
save