Domanda

Nel mio lavoro quotidiano io e altri membri del mio team scriviamo molti modelli hardware in Verilog-AMS, un linguaggio supportato principalmente da fornitori commerciali e da alcuni progetti di simulatore opensource.Una cosa che renderebbe più utile il supporto reciproco del codice sarebbe un LINTER che verificherebbe la presenza di problemi comuni nel nostro codice e aiuterebbe a imporre uno stile di formattazione del codice condiviso.Ovviamente voglio essere in grado di aggiungere le mie regole e, dopo aver dimostrato a me stesso la loro utilità, promuoverle al resto della squadra.Non mi dispiace fare il lavoro che deve essere fatto, ma ovviamente voglio anche sfruttare il lavoro di altri progetti esistenti.

Avere la sintassi della lingua consentita in formato yacc o bison mi dà un vantaggio?o dovrei semplicemente risucchiare ogni istruzione linguistica in una stringa Perl e usare la corrispondenza dei modelli per trovare le cose che non mi piacciono?

(la maggior parte degli errori di sintassi e di compilazione vengono facilmente rilevati dagli strumenti commerciali..ma abbiamo alcune delle nostre estensioni.)

È stato utile?

Soluzione

lex/flex e yacc/bison forniscono generatori lexer e parser facili da usare e ben compresi, e consiglierei davvero di fare qualcosa del genere invece di farlo proceduralmente ad es.Perl.Le espressioni regolari sono strumenti potenti per separare stringhe con una struttura relativamente, ma non totalmente fissa.Con qualsiasi linguaggio di programmazione reale, la dimensione della tua macchina a stati diventa semplicemente ingestibile con qualcosa che non sia un Real Lexer/Parser (tm).Immagina di dover gestire tutti i possibili interlacciamenti di parole chiave, identificatori, operatori, parentesi estranee, punti e virgola estranei e commenti consentiti in qualcosa come Verilog AMS, solo con espressioni regolari e codice procedurale.

Non si può negare che ci sia una sostanziale curva di apprendimento lì, ma scrivere una grammatica che puoi usare per flex e bison e fare qualcosa di utile sull'albero della sintassi che esce da bison, sarà un uso molto migliore del tuo tempo che scrivere un tonnellata di codice di elaborazione di stringhe in casi speciali che viene gestito in modo più naturale utilizzando in primo luogo un albero della sintassi.Inoltre, ciò che imparerai scrivendolo in questo modo amplierà davvero le tue competenze in un modo in cui scrivere un mucchio di codice Perl complicato semplicemente non lo farà, quindi se ne hai i mezzi, lo consiglio vivamente ;-)

Inoltre, se sei pigro, dai un'occhiata ai plugin Eclipse che eseguono l'evidenziazione della sintassi e il refactoring di base per Verilog e VHDL.Sono in uno stato incredibilmente primitivo, l'ultima volta che ho controllato, ma potrebbero avere parte del codice che stai cercando, o almeno un pezzo di codice di base da esaminare per informare meglio il tuo approccio nel crearne uno tuo.

Altri suggerimenti

Ho scritto un paio di parser Verilog e suggerirei PCCTS/ANTLR se il tuo linguaggio di programmazione preferito è C/C++/Java.C'è un PCCTS/ANTLR Grammatica Verilog con cui puoi iniziare.Il mio generatore di parser preferito è Zebù che è basato su Common Lisp.

Naturalmente il lavoro più importante è specificare tutte le regole di lanugine.Ha senso creare una sorta di linguaggio per specificare anche le regole di linting.

Non sottovalutare la quantità di lavoro necessaria per realizzare un linter.L'analisi è la parte facile perché hai strumenti (bison, flex, ANTLR/PCCTS) per automatizzarne gran parte.

Ma una volta che hai un'analisi, allora cosa?È necessario creare un albero semantico per la progettazione.A seconda di quanto siano complicati i tuoi input, devi elaborare il progetto Verilog-AMS (ad es.risoluzione dei parametri, svolgimento delle generazioni, ecc.Se usi queste funzionalità).E solo allora puoi provare ad attuare le regole.

Prenderei seriamente in considerazione altre possibili soluzioni prima di scrivere un linter, a meno che il numero di utenti e il potenziale risparmio di tempo non giustifichino il tempo di sviluppo.

Nel tentativo di trovare la mia risposta, ho trovato questo su ANTLR - potrebbe essere utile

Se usi Java (e quindi IDEA), gli IDE estensioni per lingue personalizzate potrebbe essere utile

yacc/bison ti dà sicuramente un vantaggio, dal momento che un buon lanugine richiederebbe l'analisi del programma.Regex (almeno la vera regex) potrebbe coprire casi banali, ma è facile scrivere codice che le regex non corrispondono ma sono comunque di cattivo stile.

ANTLR sembra essere un percorso alternativo al più comune (OK IO ne ho già sentito parlare) approccio YACC/BISON, che risulta essere comunemente utilizzato anche da LEX/FLEX come front-end.

una lettura veloce della pagina man di FLEX mi fa pensare che potrebbe essere la struttura per quel tipo di idea regex..

OK..Lascerò bollire ancora un po' la cosa, poi vedrò quanto velocemente riesco a costruire un prototipo di parser nell'uno o nell'altro.

e ancora un po'

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top