我正在尝试获取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
。
我错过了什么?
答案 0 :(得分:1)
知道了!虽然我通常会删除这个问题,但如果其他人也从根本上误解了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