Problème avec la grammaire de la cime des arbres, ne correspond pas à toutes les options
Question
Je suis en train d'écrire un petit analyseur de Lisp vraiment simple rubis avec le joyau de la cime des arbres juste pour expérimenter avec elle. Cependant, il ne fonctionne pas vraiment comment je veux, et la documentation est assez pauvre donc il est difficile de comprendre ce que je fais mal. À l'heure actuelle, la grammaire peut correspondre à la fois un symbole et un booléen, mais pas un nombre. Cependant, quand je passe l'ordre dans la règle de l'atome, par exemple bool / numéro / symbole, il correspond toujours pour les deux premiers, mais pas le dernier. Y at-il une limite dans le joyau de la cime des arbres que cela signifie que vous ne pouvez avoir deux options dans une règle? En outre, quelque chose comme « (3) » ne fonctionne toujours pas analysé.
Ma grammaire est la suivante:
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
Je teste comme ils ont fait preuve dans le tutoriel, avec:
parser = LispParser.new
if parser.parse('T')
puts "Success"
else
puts "Fail"
end
La solution
La façon dont vous avez défini les règles number
et symbol
ils toujours (parce que les moyens de *
« zéro ou plus » et vous pouvez toujours trouver quelque chose de zéro). Cela signifie que si vous essayez d'analyser « 42 », l'analyseur premiers matchs avec succès la règle symbol
contre la chaîne vide au début et alors attendez-vous pas d'autres commentaires.
Pour résoudre ce problème il suffit de remplacer *
avec +
.