O Coco/R é um gerador de compiladores, que leva uma gramática atribuída de uma linguagem de origem e gera um scanner e um analisador para esse idioma. O scanner trabalha como um autômato finito determinístico. O analisador usa descida recursiva. LL (1) Os conflitos podem ser resolvidos por um lookahead multi-símbolo ou por verificações semânticas. Assim, a classe de gramáticas aceitas é ll (k) para um k arbitrário.
Eu uso a versão Turbo Pascal do Coco / R há muito tempo. Às vezes era necessário alterar o código. Se as fontes mudaram, eu o recompalhei. Mas depois de algumas atualizações do Windows, descobri que o Turbo Pascal varia para um lugar melhor e parou de correr. Em geral, acho que as línguas de muitas pessoas de Niklaus Emil Wirth causam antipatia.
Em geral, acredito que existem poucas pessoas que fizeram uma contribuição comparável ao desenvolvimento de idiomas de programação e ciência da computação.
É fácil encontrar uma solução complexa e muitas vezes incompreensível para um problema. É difícil fazer uma solução simples, limpa e compreensível.
Quando você vê essa decisão, fica claro que este é o trabalho do Grão -Mestre com uma letra maiúscula. Primeiro, enviei o código do Turbo Pascal. Mas descobri que em quase 20 anos muita água fluiu sob a ponte e o código Coco/R também foi melhorado.
A última versão que encontrei foi C ++, C #, Java. Então eu decidi portar o código e escolher C #. Em espírito, este é o idioma mais próximo de Delphi, provavelmente devido ao fato de terem um arquiteto -chefe.
Você pode ver um exemplo de uso no projeto Protobuf-Delphi.
É suposto usar o mesmo conjunto de quadros para scanner e analisador para diferentes idiomas. O compilador conta com uma estrutura de quadros bastante fixa para scanner e analisador. Não é desejável alterar a ordem das seções, pois isso pode levar a erros de compilação no código gerado.
Cocor.exe -namespace Taste -checkEOF -trace AG taste.atg.
O namespace é usado ao gerar um nome de módulo. Agora isso é usado nos quadros do scanner e analisador.
MACROS
prefix = "cr" .