Volevo creare un parser per le regole grammaticali parametrizzate, come
int = a:/[0-9]+/ {parseInt(a)}
double(a) = a a
double2(c) = double(c)
È come BNF, a a
a destra significa che abbiamo due regole / parser identici in serie. Ma cos'è un? Non è letterale. Un letterale sarebbe "un" sul RHS. Il termine a
a destra è qualsiasi parser / regola che fornisci per raddoppiare.
Identifico i parser con le regole poiché esiste una corrispondenza uno a uno: per ogni regola, un parser viene generato dal mio generatore. Ciò significa che puoi "01". Pars (parsers.int) e il parser int corrisponderà all'ingresso 01.
Finora, ho completato il parser di grammatica, che mi dà AST della mano destra. Ho anche realizzato il parsifier, che è un processo di conversione di AST in parser (s), simile alla conversione di stringhe AST in una stringa. Analizzo quasi tutte le grammatiche tranne il combinatore call another rule
. Nell'esempio sopra, queste sono a
e double(c)
regole poiché sono riferimenti ad altre regole / parser.
Durante l'analisi grammaticale, posso impostare un registro di ruleName - > parser. Funzionerà per int
, quando si fa riferimento in rhs. Ma come gestisci gli argomenti?
Il nodo AST di riferimento è a conoscenza sia del nome della regola di riferimento sia degli argomenti parsitificati, se presenti, ad es. se l'argomento è una combinazione and-then (series) di N parser o one-of alternative of parsers. Ma, non ho idea di come gestire i riferimenti ad altri parser se sono parametrizzati. Tra parentesi, sul RHS, gli argomenti della chiamata possono essere nomi globali, come int, o argomenti della funzione dal LHS, il che significa che prima che il nostro parser venisse chiamato, qualcosa doveva essere aggiunto nel registro del parser tale che espandi la regola globaleName - > parser table con argomenti della funzione termprary in modo tale che quando il parser rhs incontra a
o c
, sa quale parser è, ma questa informazione non deve essere disponibile per altri parser.
Probabilmente, ho bisogno di finire la mia merda. Hai una buona idea di come questo materiale sia fatto facilmente? Quali strutture computazionali ho bisogno?