Principalmente uso swi-prolog quindi la maggior parte di ciò che dico sarà correlata a swi-prolog. Tuttavia, altre implementazioni di prolog possono avere predicati/librerie simili (forse con un nome leggermente diverso), quindi è possibile cercare i loro manuali e trovarli. Inoltre, sto scrivendo un compilatore, non un interprete, in prolog quindi forse alcune parti non sono così correlate all'interprete.
SWI-Prolog's documentation site è davvero buono per la ricerca di informazioni: utilizzare la casella di ricerca per trovare qualsiasi predicato o effettuare una ricerca tipica. C'è una miriade di librerie, ma potresti voler implementare alcune cose tu stesso per acquisire esperienza. Potresti finire per reinventare la ruota ma sarebbe utile.
Il libro "The Art of Prolog" (Sterling, Shapiro) ha un capitolo dedicato alla costruzione di un compilatore in prolog (ed è anche un bel libro per prolog).
Forse ci sono alcuni strumenti equivalenti a lex/bison per il prologo; non ho mai cercato veramente
Imho, il lexer è abbastanza semplice in prologo semplice; naturalmente, sarà basato pesantemente sulla corrispondenza del modello.
Per il parser, suggerisco di utilizzare DCG: grammatiche con clausole definite: swi-prolog doc, google per ulteriori dettagli.
Il problema è che dovrai analizzare l'intero file (o almeno non ho trovato un modo per farlo diversamente). Btw, il lexer potrebbe anche essere fatto con DCGs ma non penso che sia molto meglio.
Se si sceglie di avere il codice intermedio, un parser tree astratto è facile da produrre dal parser (è possibile valutare molte cose anche durante l'analisi).
Informazioni sui controlli semantici: nel mio compilatore per un linguaggio giocattolo eseguo la maggior parte dei controlli semantici (ambito correlato, chiamate di funzione) durante l'analisi e il resto in un passaggio separato. E 'un disordinato
altre cose utili po': Controllo affermare/1, le variabili globali, meta predicates (maplist/[2-6]).
puro prologo e si potrebbe rendere il codice troppo imperativo per abusare di loro (e quindi si potrebbe avere alcuni effetti collaterali veramente brutto)
Per la tabella dei simboli (se necessaria) è possibile utilizzare assert/1 per aggiungere predicati: swi-prolog utilizza tabelle di hash dinamiche per i predicati dinamici. avviso: i predicati dinamici sono più lenti di quelli statici quindi, quando si completa la tabella e non si apportano modifiche, utilizzare compile_predicates/1 per renderli statici. Ad esempio, quando finisco di parsing il mio ST è pronto, quindi lo compilo. Un'altra soluzione per la ST è l'utilizzo di association lists. sono implementati con alberi AVL, quindi il costo è O (log (N)).
Volete creare un linguaggio in cui implementate il runtime per questo tramite un codice byte o desiderate un approccio meta-interprete? –
@Countably Infinite, stavo per un approccio metainterpreter.L'alternativa che hai menzionato sembra un po 'troppo data la mia mancanza di esperienza. – arkate