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?

¿Fue útil?

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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top