Question

J'ai contribué à enrichir un langage propriétaire vieux d'une vingtaine d'années au sein de mon entreprise. C'est un grand langage complet de Turing. Le traduire en un autre régime grammatical (tel que Antlr) n’est pas une option (je n’arrive pas à décider cela).

La plupart du temps, l’extension de la grammaire s’est bien déroulée. Mais de temps en temps, je vais obtenir un réduire-réduire ou changer-réduire que

  • est difficile à éliminer
  • Parfois, cela n'a aucun sens (à mon faible cerveau)

Après avoir longuement regardé de manière pénible les fichiers y.output et les refactorisations de grammaire expérimentales, je suis généralement arrivé à l’endroit où je voulais aller. Parfois, j'ai dû faire des compromis insatisfaisants.

Existe-t-il des outils capables d’absorber une grammaire yacc, qui améliorent la navigation, l’expérimentation et permettent le débogage des modifications?

Si j'ajoute une production, j'aimerais voir plus que "la production atomique utilisée partout" (pensez l'identifiant) " est en conflit avec la règle foo " (oui, il y a plus d'informations, s / r, r / r, mais je pense que vous comprenez ma dérive). Ce serait bien d’avoir un aperçu de l’interaction qui va au-delà de la réflexion et de l’imagination d’une pile de symboles et d’une machine à états.

Mise à jour: Je suppose que je devrais clarifier. Nous utilisons Berkeley Yacc. J'ai testé avec une version récente de Bison. Pour la sortie, j'ai compilé la grammaire avec - report = itemset .

Mon objectif avec ce message est de rechercher des outils externes qui augmentent les fonctionnalités de débogage grammatical livrées avec yacc. C'est douloureux aujourd'hui avec le jeu par défaut. Aidez-moi à trouver de meilleurs outils interactifs, tels que ceux que vous pouvez utiliser avec Antlr.

Était-ce utile?

La solution

Vous pourriez obtenir de l'aide de yacc -d , qui produit une sortie de débogage - il donne en gros une liste complète des états de la pile de symboles, etc. La sortie est dense et volumineuse, alors essayer de tout lire directement donne rarement beaucoup de résultats (ce n’est jamais le cas pour moi). Cependant, lorsque vous modifiez le conflit (par exemple) un conflit r / r, vous pouvez exécuter yacc -d sur l'ancienne grammaire et la nouvelle, puis exécuter diff sur les résultats pour obtenir une description beaucoup plus détaillée des changements qui ont provoqué le conflit.

Toutefois, il est probablement intéressant de noter que les conflits S / R sont souvent bénins - à moins que vous ne soyez assez sûr que ce soit un problème, essayez de "réparer" les problèmes rencontrés. ce n'est souvent pas la peine. Le même n'est pas vrai avec des conflits r / r cependant. Bien qu'ils soient parfois bénins, ils sont comparativement rares.

Edit: Oups - désolé, cela devrait être -v. Vous mentionnez y.putput, vous savez donc apparemment déjà comment faire cette partie. Le fait est que vous n’essayez pas d’examiner directement les fichiers y.output, mais de faire une différence entre celui qui est sorti proprement et celui qui ne permet pas d’obtenir des détails sur le conflit (sans regarder 10 jillion de lignes de "choses", ça va.

Autres conseils

C'est le meilleur que j'ai eu: http://tldp.org/HOWTO/Lex-YACC-HOWTO-7. html

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top