Sono in realtà un bambino, haha. Non ho mai scritto un compilatore prima o progettato un linguaggio, ma ho finito The Red Dragon Book, quindi suppongo di avere un'idea (spero).
Dipenderebbe innanzitutto dalla grammatica. Se è LR o LALR suppongo che strumenti come Bison/Flex funzionino bene. Se è più LL, userei Spirit, che è un componente di Boost. Ti permette di scrivere la grammatica della lingua in C++ in una sintassi simile a EBNF, quindi non confondere con i generatori di codice; il compilatore C++ compila la grammatica per te. Se qualcuno di questi fallisce, scriverò una grammatica EBNF su carta e poi procederò a fare un parsing ricorsivo di discesa, che sembra funzionare; se C++ può essere analizzato abbastanza bene usando RDP (come fa GCC), allora suppongo che con un sufficiente numero di test e pazienza potreste scrivere interi compilatori usando RDP.
Una volta eseguito un parser e una sorta di rappresentazione intermedia, dipende da come viene eseguito. Se si tratta di un codice bytecode o di un compilatore di codice nativo, userò LLVM o libJIT per elaborarlo. LLVM è più adatto per la compilazione generale, ma mi piace l'API libJIT e la documentazione migliore. In alternativa, se sono veramente pigro, genererò il codice C e lascerò a GCC la compilazione vera e propria. Un'altra alternativa è quella di indirizzare una macchina virtuale esistente, come Parrot o JVM o CLR. Parrot è la VM progettata per Perl. Se è solo un interprete, camminerò sull'albero della sintassi.
Un'alternativa radicale consiste nell'utilizzare Prolog, che dispone di funzioni di sintassi che simulano notevolmente l'EBNF. Non ho esperienza con esso, però, e se non sbaglio (che quasi certamente sarò), Prolog sarebbe abbastanza lento se usato per analizzare i linguaggi di programmazione heavy duty con molti costrutti sintattici e stranezze (leggi: C++ e Perl).
Tutto ciò che farò in C++, se non altro perché sono più abituato a scrivere in esso rispetto a C. starei lontano da Java/Python o qualcosa del genere per il codice di produzione attuale (scrivendo compilatori in C/C++ aiuta a renderlo portabile), ma potevo vedere me stesso usandoli come linguaggio di prototipazione, in particolare Python, a cui sono parziale. Naturalmente, non ho mai fatto nulla di tutto ciò prima, quindi non sono uno da dire.
Per la cronaca, noi "figli" usano ancora la riga di comando e cavillo su quale shell è superiore, o almeno lo faccio C. C è morto, ma ora devo fuggire dall'avanguardia dei programmatori C, quindi ci vediamo in giro! –
Che tipo di linguaggio, interpretato o compilato? –
interpretato o compilato? Hmmm buona domanda.Però suppongo che faccia la differenza, quindi dirò entrambi solo per essere al sicuro. – Mike