Question

Dans mon travail quotidien, moi-même et les autres membres de mon équipe écrivons de nombreux modèles de matériel dans Verilog-AMS, un langage pris en charge principalement par des fournisseurs commerciaux et quelques projets de simulateur opensource. Une des choses qui rendrait le support du code des autres utilisateurs plus utile serait un LINTER qui vérifierait notre code pour détecter les problèmes courants et aiderait à appliquer un style de formatage de code partagé. Je veux bien sûr pouvoir ajouter mes propres règles et, une fois que je me prouve leur utilité, les promouvoir auprès du reste de l'équipe. Cela ne me dérange pas de faire le travail qui doit être fait, mais bien sûr, je veux aussi tirer parti du travail d’autres projets existants.

Avoir la syntaxe de langue autorisée dans un format yacc ou bison me donne-t-il un avantage? ou devrais-je simplement aspirer chaque déclaration de langue dans une chaîne perl et utiliser une correspondance de modèle pour rechercher les éléments que je n'aime pas?

(la plupart des erreurs de syntaxe et de compilation sont facilement détectées par les outils commerciaux .. mais nous avons certaines de nos propres extensions.)

Était-ce utile?

La solution

lex / flex et yacc / bison fournissent des générateurs de lexer et de parser faciles à utiliser et bien compris, et je recommanderais vraiment de faire quelque chose comme cela plutôt que de le faire de manière procédurale, par exemple. Perl. Les expressions régulières sont des outils puissants pour déchirer des chaînes avec une structure relativement fixe, mais pas totalement figée. Quel que soit le langage de programmation utilisé, la taille de votre machine à états devient tout simplement ingérable, à l'exception de Real Lexer / Parser (tm). Imaginez que vous puissiez gérer tous les liens possibles entre mots-clés, identificateurs, opérateurs, parenthèses superflues, points-virgules superflus et commentaires autorisés dans quelque chose comme Verilog AMS, avec uniquement des expressions régulières et un code de procédure.

On ne peut nier qu'il existe une courbe d'apprentissage substantielle, mais écrire une grammaire que vous pouvez utiliser pour flex et bison et faire quelque chose d'utile dans l'arbre de syntaxe issu de bison vous permettront de mieux utiliser votre temps. que d'écrire une tonne de code de traitement de chaînes de casse qui est plus naturellement traité en utilisant un arbre de syntaxe en premier lieu. En outre, ce que vous apprendrez à écrire de cette manière élargira réellement vos compétences, de telle sorte que l’écriture d’un tas de code hacky Perl ne le sera tout simplement pas, donc si vous en avez les moyens, je le recommande vivement; -)

Si vous êtes paresseux, consultez également les plug-ins Eclipse qui mettent en évidence la syntaxe et le refactoring de base pour Verilog et VHDL. La dernière fois que j'ai vérifié, ils sont dans un état incroyablement primitif, mais ils peuvent contenir le code que vous recherchez, ou au moins un élément de code de base à consulter pour mieux éclairer votre approche en faisant rouler le vôtre.

Autres conseils

J'ai écrit quelques analyseurs Verilog et je suggérerais PCCTS / ANTLR si votre langage de programmation préféré est C / C ++ / Java. Il existe une grammaire PCCTS / ANTLR Verilog . Mon générateur d'analyseur préféré est Zebu , qui est basé sur Common Lisp.

Bien sûr, le gros travail consiste à spécifier toutes les règles de filtrage. Il est logique de créer un langage spécifiant également les règles de filtrage.

Ne sous-estimez pas la quantité de travail que nécessite un linter. L’analyse est la partie la plus facile car vous avez des outils (bison, flex, ANTLR / PCCTS) pour en automatiser une grande partie.

Mais une fois que vous avez une analyse, alors quoi? Vous devez construire un arbre sémantique pour la conception. En fonction de la complexité de vos entrées, vous devez élaborer la conception de Verilog-AMS (c'est-à-dire résoudre les paramètres, générer le déroulement, etc. Si vous utilisez ces fonctions). Et alors seulement, vous pourrez essayer de mettre en place des règles.

Je réfléchirais sérieusement à d’autres solutions possibles avant d’écrire un linter, à moins que le nombre d’utilisateurs et les économies de temps potentielles ne justifient de ce fait le temps de développement.

En essayant de trouver ma réponse, j'ai trouvé ceci sur ANTLR - pourrait être utile

Si vous utilisez Java (et donc IDEA), les extensions personnalisées de l'EDI langues pourraient être utiles

yacc / bison vous donne définitivement un coup de pouce, puisqu'un bon filtrage nécessiterait l'analyse du programme. Les expressions régulières (vraies au moins) peuvent couvrir des cas triviaux, mais il est facile d'écrire du code si les expressions régulières ne correspondent pas mais sont toujours de mauvais style.

ANTLR semble être un chemin alternatif à l’approche YACC / BISON la plus courante (OK j’en ai entendu parler auparavant), ce qui révèle qu’il est également courant d’utiliser LEX / FLEX comme interface frontale.

une lecture rapide de la page de manuel de FLEX me fait penser que cela pourrait être le cadre pour ce type d’idée regex.

Ok. Je vais laisser ce ragoût un peu plus longtemps, puis je vais voir à quelle vitesse je peux construire un analyseur prototype dans l’un ou l’autre.

et un peu plus longtemps

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