Treetop: разбор одного узла возвращает Nil
Вопрос
Я пытаюсь получить базовый анализ Treetop. Вот очень простой бит грамматики, чтобы я мог сказать 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
Разборка 2+2
Работает правильно, возвращая узел. Однако разборка 2
или 22
возвращается nil
.
Что я пропустил?
Решение
Понятно! Хотя я бы обычно удалил вопрос, я бы не удивил, если кто-то еще также принципиально неправильно понимает 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
Не связан с StackOverflow