Coco/R es un generador de compiladores, que toma una gramática atribuida de un lenguaje fuente y genera un escáner y un analizador para este idioma. El escáner funciona como un autómata finito determinista. El analizador utiliza descenso recursivo. LL (1) Los conflictos se pueden resolver mediante un aspecto de múltiples símbolos o mediante controles semánticos. Por lo tanto, la clase de gramáticas aceptadas es ll (k) para un arbitrary k.
He estado usando la versión Turbo Pascal de Coco / R durante mucho tiempo. A veces era necesario cambiar el código. Si las fuentes cambiaron, lo recompilé. Pero después de una actualización de Windows, descubrí que Turbo Pascal va a un lugar mejor y dejó de funcionar. En general, creo que los idiomas de muchas personas de Niklaus Emil Wirth causan a no disgustación.
En general, creo que hay pocas personas que han hecho una contribución comparable al desarrollo de lenguajes de programación e informática.
Es fácil encontrar una solución compleja y a menudo incomprensible para un problema. Es difícil hacer una solución simple, limpia y comprensible.
Cuando ves tal decisión, queda claro que este es el trabajo del Gran Maestro con una letra mayúscula. Primero, porté el código de Turbo Pascal. Pero descubrí que en casi 20 años mucha agua ha fluido debajo del puente y el código Coco/R también se ha mejorado bien.
La última versión que encontré fue C ++, C #, Java. Luego decidí portar el código y elegí C #. En espíritu, este es el lenguaje más cercano a Delphi, probablemente debido al hecho de que tienen un arquitecto principal.
Puede ver un ejemplo de uso en el proyecto ProtoBuf-Delphi.
Se supone que utiliza el mismo conjunto de marcos para escáner y analizador para diferentes idiomas. El compilador se basa en una estructura de cuadro bastante fija para el escáner y el analizador. No es deseable cambiar el orden de las secciones, ya que esto puede conducir a errores de compilación en el código generado.
Cocor.exe -namespace Taste -checkEOF -trace AG taste.atg.
El espacio de nombres se usa al generar un nombre de módulo. Esto ahora se usa en los marcos de escáner y analizador.
MACROS
prefix = "cr" .