Problème avec la grammaire de la cime des arbres, ne correspond pas à toutes les options

StackOverflow https://stackoverflow.com/questions/3732416

  •  03-10-2019
  •  | 
  •  

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
Était-ce utile?

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 +.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top