Question

La base de logiciels pour laquelle je suis en train de développer utilise une quantité importante de yacc que je n'ai pas besoin de traiter. Quelques fois, je pense que ce serait utile de comprendre certains problèmes que je trouverais mais la plupart du temps, je peux m'en tirer avec ma totale ignorance de yacc.

Ma question est-ce qu'il y a suffisamment de nouveaux projets là-bas qui utilisent encore yacc pour garantir le temps qu'il me faudra pour l'apprendre?

Modifier: étant donné que la réponse est principalement favorable à l'apprentissage de Yacc, existe-t-il un langage similaire à celui que vous recommanderiez par rapport à yacc?

Était-ce utile?

La solution

Oui, ces outils valent la peine d'être appris si vous devez créer ou modifier du code qui analyse une grammaire.

Pendant de nombreuses années, l'outil de facto permettant de générer du code pour analyser une grammaire était yacc, ou son cousin GNU, le bison.

Dernièrement, j'ai entendu dire qu'il y avait deux nouveaux enfants dans le quartier, mais le principe est le même: vous écrivez une grammaire déclarative dans un format plus ou moins sous la forme Backus-Naur ( BNF ) et yacc / bison / what génère pour vous un code extrêmement fastidieux. à la main.

De même, les principes sous-jacents aux grammaires peuvent être très utiles à apprendre, même si vous n’avez pas besoin de travailler directement sur ce code. Je n'ai pas beaucoup travaillé avec les analyseurs depuis que j'ai suivi un cours sur la conception de compilateur au collège, mais la compréhension des piles d'exécution, des analyseurs d'anticipation, de l'évaluation des expressions et de nombreuses autres choses connexes m'a considérablement aidée à écrire et à déboguer mon code.

modifier : compte tenu de votre question suivante concernant les autres outils, Yacc / Bison est bien sûr préférable aux projets C / C ++, car ils génèrent du code C. Il existe des outils similaires pour d'autres langues. Toutes les grammaires ne sont pas équivalentes, et certains générateurs d’analyseurs syntaxiques ne peuvent grammer que des grammaires d’une certaine complexité. Vous devrez donc peut-être trouver un outil capable d'analyser votre grammaire. Voir http://en.wikipedia.org/wiki/Comparison_of_parser_generators

.

Autres conseils

Je ne sais pas si de nouveaux projets l'utilisent, mais je participe à sept tâches de maintenance utilisant lex et yacc pour le traitement des fichiers de configuration.

Pas de XML pour moi, no-sir-ee: -).

Les solutions utilisant lex / yacc constituent une avancée par rapport aux anciens fichiers de configuration des lignes key = val car elles permettent de meilleures structures hiérarchiques telles que:

server = "mercury" {
    ip = "172.3.5.13"
    gateway = "172.3.5.1"
}
server = "venus" {
    ip = "172.3.5.21"
    gateway = "172.3.5.1"
}

Et oui, je sais que vous pouvez le faire avec XML, mais ce sont principalement des applications traditionnelles écrites en C et, pour être honnête, j'utiliserais probablement lex / yacc pour les nouveaux travaux (non-Java).

C'est parce que je préfère fournir des logiciels dans les délais et dans les budgets, plutôt que de fournir la meilleure technologie de pointe: mes clients ne paieront pas pour mes études, ils veulent avant tout des résultats et je suis déjà un expert de Lex / Yacc. et avoir tout le code du modèle pour le faire rapidement.

Une règle générale: le code dure longtemps, donc les technologies utilisées dans ce code durent aussi longtemps. Cela prendrait énormément de temps pour remplacer le code que vous avez mentionné (il a fallu 15 ans pour le construire ...), ce qui implique qu'il restera encore dans 5, 10 ou plus ans. (Il y a même une chance que quelqu'un qui lit cette réponse finisse par y travailler!)

Autre règle empirique: si une technologie polyvalente est assez commune pour que vous l’ayez déjà rencontrée, c’est probablement assez pour que vous deviez vous familiariser avec elle, car vous la reverrez un jour. Qui sait: en vous y familiarisant, vous avez peut-être ajouté un outil utile à votre boîte à outils ...

Yacc est l’une de ces technologies: vous allez probablement le retrouver, ce n’est pas si difficile et les principes que vous apprendrez s’appliquent à toute la famille des constructeurs d’analyseurs.

Les

des PEG sont le nouveau point chaud, mais de nombreux projets utilisent encore yacc ou des outils plus modernes que yacc. Je voudrais froncer les sourcils sur un nouveau projet qui a choisi d'utiliser yacc, mais pour les projets existants, le transfert vers un outil plus moderne peut ne pas avoir de sens. Il est donc utile d’avoir une connaissance approximative de yacc.

Si vous n’êtes pas familiarisé avec le sujet des générateurs d’analyseurs, je vous encourage à en apprendre davantage sur l’un, l’un ou l’autre. Beaucoup de concepts sont portables entre eux. C'est aussi un outil utile à avoir dans la ceinture: une fois que vous en connaissez un, vous comprendrez comment ils peuvent souvent être supérieurs aux analyseurs syntaxiques écrits à la main. Si vous êtes déjà à l'aise avec le sujet des analyseurs syntaxiques, je ne m'en inquiéterais pas. Vous apprendrez le yacc si et quand vous en aurez besoin pour accomplir quelque chose.

Je travaille sur des projets utilisant Yacc. Ce n'est pas un nouveau code - mais s'ils étaient nouveaux, ils utiliseraient toujours Yacc ou un parent proche (Bison, Byacc, ...).

Oui, je considère qu’il vaut la peine d’apprendre si vous travaillez en C.

Pensez également à apprendre ANTLR, ou d’autres générateurs d’analyseurs plus modernes. Mais la connaissance de Yacc vous sera très utile. Elle vous aidera également à apprendre d’autres outils similaires, car une grande partie de la théorie de base est similaire.

Je ne connais pas spécifiquement Yacc / Bison, mais j’ai utilisé antlr, cup, jlex et javacc. Je pensais qu’ils n’auraient qu’une importance académique, mais il s’est avéré qu’il nous fallait un langage spécifique à un domaine, ce qui nous a fourni une solution bien plus agréable que certains "plus simples". Analyseurs syntaxiques (basés sur regex). La maintenance peut poser problème dans de nombreux environnements, car la plupart des programmeurs n’ont actuellement aucune expérience des outils d’analyse.

Je n'ai pas encore eu la chance de le comparer à d'autres systèmes d'analyse syntaxique, mais je peux certainement recommander ANTLR . sur la base de ma propre expérience et aussi avec sa base d’utilisateurs importante et active.

Un autre avantage pour ANTLR est ANTLRWorks: l'environnement de développement de l'interface graphique ANTLR , qui est d'une aide précieuse pour développer et déboguer vos grammaires. Je n'ai pas encore vu d'autre système d'analyse pris en charge par un tel IDE.

Nous écrivons un nouveau code Yacc dans mon entreprise pour l’expédition de produits. Oui, ce matériel est toujours utilisé.

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