Treetop: l'analyse syntaxique unique rendements de noeuds nuls
Question
Je suis en train d'obtenir la base de l'analyse syntaxique arboricole. Voici un peu simple de la grammaire afin que je puisse dire ArithmeticParser.parse('2+2').value == 4
.
grammar Arithmetic
rule additive
first:number '+' second:number {
def value
first.value + second.value
end
}
end
rule number
[1-9] [0-9]* {
def value
text_value.to_i
end
}
end
end
Parsing 2+2
fonctionne correctement, le retour d'un nœud. Cependant, l'analyse syntaxique 2
ou retourne 22
nil
.
Qu'est-ce que je manque?
La solution
Je l'ai! Bien que je normalement supprimer la question, je ne serais pas surpris si quelqu'un d'autre aussi fondamentalement arboricole méprend, donc je vais laisser ce ici pour référence.
arboricole ne va pas seulement à travers les règles, à la recherche que l'on applique. Au lieu de cela, il commence à la première règle, et, si la première règle ne correspond pas, il doit être forcé à envisager des alternatives. Par conséquent, / number
doit apparaître à la fin de la règle de additive
.
grammar Arithmetic
rule additive
first:number '+' second:number {
def value
first.value + second.value
end
}
/ number
end
rule number
[1-9] [0-9]* {
def value
text_value.to_i
end
}
end
end