Pergunta

Eu tenho ajudado aumentar um vinte e alguns anos linguagem proprietária de idade dentro de minha empresa. É uma linguagem grande, Turing completo. Traduzi-lo para outro regime gramática (como Antlr) não é uma opção (eu não conseguir decidir isso).

Para a maior parte, estendendo a gramática tem corrido bem. Mas de vez em quando eu vou conseguir um reduz-reduz ou shift-reduce que

  • é difícil de eliminar
  • , por vezes, simplesmente não faz sentido (para o meu cérebro fraco)

Depois de muito doloroso olhar fixamente em y.output arquivos e refatorações gramática experimentais, eu normalmente chegado onde eu queria ir. Às vezes eu tive que fazer concessões insatisfatórios.

Assim, existem quaisquer ferramentas lá fora, que pode sugar em uma gramática yacc, que melhoram a navegação, experimentando, e permitir a depuração de alterações?

Se eu adicionar uma produção, eu gostaria de ver mais do que "a produção atômica que é usado em todos os lugares" (pense identificador) "conflitos com foo regra" (sim, há mais informações, s / r, r / r , do que isso, mas eu acho que você me entende). Seria bom ter algum indício da interação além de colocar na minha cabeça para pensar e tentar imaginar uma máquina de pilha símbolo e estado.

Update: Eu acho que deveria esclarecer. Usamos Berkeley Yacc. Tenho vindo a testar usando uma versão recente do Bison. Para saída, eu compilei a gramática com -. Relatório = itemset

Meu objetivo com este post é procurar externos ferramentas que augment a gramática depuração instalações que navio com yacc. É doloroso, hoje, com o conjunto padrão. Ajuda-me a encontrar melhores ferramentas interativas, tais como aqueles que você pode usar com Antlr.

Foi útil?

Solução

Você pode obter alguma ajuda de yacc -d, que produz saída de depuração - que basicamente dá uma listagem completa dos estados símbolo de pilha e tal. A saída é densa e volumosa, de modo a tentar ler tudo isso diretamente raramente realiza muito (nunca tem pelo menos para mim). No entanto, quando você faz uma alteração a dá (por exemplo) um conflito r / r, você pode executar yacc -d na antiga gramática e o novo, diff, em seguida, executar os resultados, para obter um run-down muito mais detalhada sobre o que mudança (s) causou o conflito.

É provavelmente vale a pena notar, no entanto, que os conflitos s / r são frequentemente benigna - a menos que você está bastante certo de que é um problema, tentar "consertar" que muitas vezes não vale a pena. O mesmo não acontece com os conflitos r / r embora. Enquanto estas são às vezes benigna, é relativamente raro.

Editar: Oops - sorry, que deve ser -v. Você menciona y.output, para que, aparentemente, já sabe como fazer essa parte. O ponto é que você não tentar olhar para os arquivos y.output diretamente, mas fazer uma comparação entre o que saiu limpa e aquele que não o fez para obter algum detalhe sobre o conflito real (sem olhando para 10 linhas jillion de "coisas" que está tudo bem.

Outras dicas

Este é o melhor que eu tenho: http://tldp.org/HOWTO/Lex-YACC-HOWTO-7. html

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top