Treetop: análisis sintáctico solo rendimientos de nodo nil
Pregunta
Estoy intentando conseguir el básico de la copa de árbol de análisis sintáctico. Aquí hay un poco de gramática muy simple de modo que puedo decir 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
de análisis funciona correctamente, devolviendo un nodo. Sin embargo, el análisis 2
o vuelve 22
nil
.
¿Qué me he perdido?
Solución
Lo tienes! Aunque me gustaría normalmente borrar la pregunta, no me sorprendería si alguien no entiende también, fundamentalmente, Cima del árbol, por lo que voy a dejar esto aquí como referencia.
Copa de árbol no sólo tiene que ir a través de las reglas, en busca de los cuales uno se aplica. En su lugar, se inicia en la primera regla, y, si es la primera regla no coincide, debe ser forzada a considerar alternativas. Por lo tanto, / number
debe aparecer al final de la regla 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