Sto usando OCaml per creare un parser di discesa ricorsivo per un sottoinsieme di Scheme. Ecco la grammatica:Building AST in OCaml
S -> a|b|c|(T)
T -> ST | Epsilon
Quindi dire che ho:
type expr =
Num of int | String of string | Tuple of expr * expr
Pseudocodice
Queste funzioni devono tornare espr tipo di costruire l'AST
parseS lr =
if head matches '(' then
parseL lr
else
match tokens a, b, or c
Utilizzando First Set di S che sono token e '(':
parseL lr =
if head matches '(' or the tokens then
Tuple (parseS lr, parseL lr)
else
match Epsilon
La mia domanda è "Come ritorno per la parte Epsilon poiché non riesco a tornare()?". Una funzione OCaml richiede lo stesso tipo di restituzione e anche se per la parte Epsilon viene lasciato vuoto, OCaml assume ancora il tipo di unità.
quindi, a mio avviso, o devo includere un segnaposto per Epsilon o regolare la grammatica data come hai menzionato. Questo sembra eliminare il problema Epsilon. Significa che ogni volta che vedo Epsilon, ho riscritto la grammatica? – lovetostrike
Direi di sì, nel concetto. In pratica significa solo guardare avanti nel parser. Se stai scrivendo il parser a mano puoi probabilmente farlo funzionare senza perdere molto tempo a riscrivere la grammatica. –
Se S restituisce a, b, c di tipo expr, cosa dovrei restituire per() parte in S? – lovetostrike