Problema con la grammatica cima d'albero, che non corrisponde tutte le opzioni
Domanda
Sto scrivendo un piccolo, molto semplice parser Lisp in rubino con la gemma cima d'albero appena a sperimentare con esso. Tuttavia, non è davvero lavorando come voglio che, e la documentazione è piuttosto scarsa, quindi è difficile capire che cosa sto facendo male. Attualmente, la grammatica può abbinare sia un simbolo e un valore booleano, ma non un numero. Tuttavia, quando passo l'ordine nella regola atomo, ad esempio per bool / numero / simbolo, corrisponde ancora per i primi due, ma non l'ultimo. C'è una limitazione nel gemma cime degli alberi che significa che è possibile avere solo due opzioni in una regola? Inoltre, qualcosa di simile a '(3)' ancora non analizza.
La mia grammatica è la seguente:
grammar Lisp
rule expression
atom / list
end
rule atom
symbol / bool / number
end
rule number
[0-9]*
end
rule bool
'T' / 'F'
end
rule symbol
[a-zA-Z]*
end
rule list
'(' expression* ')'
end
end
sto testando come hanno mostrato nel tutorial, con:
parser = LispParser.new
if parser.parse('T')
puts "Success"
else
puts "Fail"
end
Soluzione
Il modo in cui si è definito le regole number
e symbol
hanno sempre corrisponde (perché significa *
"zero o più" e si può sempre trovare qualcosa di zero). Questo significa che se si tenta di analizzare "42", il parser prime partite con successo la regola symbol
contro la stringa vuota all'inizio e poi si aspettano non fare altre operazioni.
Per risolvere il *
sostituire semplicemente con +
.