2010-09-17 3 views
1

J'écris un petit analyseur lisp en rubis avec la gemme de la cime des arbres pour l'expérimenter. Cependant, ça ne marche pas vraiment comme je le veux, et la documentation est assez pauvre donc il est difficile de comprendre ce que je fais de mal. Actuellement, la grammaire peut correspondre à la fois à un symbole et à un booléen, mais pas à un nombre. Cependant, quand je change l'ordre dans la règle d'atome, par exemple à bool/number/symbol, il correspond toujours aux deux premiers, mais pas au dernier. Y at-il une limite dans la gemme de la cime des arbres qui signifie que vous ne pouvez avoir deux options dans une règle? De même, quelque chose comme '(3)' n'analyse toujours pas.Problème avec la grammaire de la cime des arbres, ne correspondant pas à toutes les options

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 

Répondre

1

La façon dont vous avez défini les règles number et symbol ils correspondent toujours (parce que * signifie "zéro ou plus" et vous pouvez toujours trouver zéro de quelque chose). Cela signifie que si vous essayez d'analyser "42", l'analyseur compare d'abord avec succès la règle symbol à la chaîne vide au début, puis n'attend aucune autre entrée.

Pour résoudre ce problème, remplacez simplement * par +.

+0

Merci qui fonctionne parfaitement maintenant. – bennybdbc

+0

@bennybdbc: De plus, comme la règle atom est définie maintenant, elle ne correspondra jamais à un booléen, car 'T' et' F' correspondent aussi à l'expression rationnelle dans la règle 'symbol', donc ils seront toujours analysés comme un 'symbole'. –

+0

@Jorg - Oui merci, je l'ai remarqué plus tôt. J'ai changé le code dans mon programme, je n'ai juste pas pensé à éditer la question. – bennybdbc

Questions connexes