Понял! Хотя я обычно удаляю этот вопрос, я не удивлюсь, если кто-то еще также фундаментально не поймет Treetop, поэтому я оставлю это здесь для справки.
Treetop не просто проходит правила, ища, какие из них применяются. Вместо этого оно начинается с первого правила, и, если первое правило не совпадает, оно должно быть вынуждено рассмотреть альтернативы. Следовательно, / number
должно появляться в конце правила 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