Frage

Ich versuche, die grundlegendste Treetop Parsing zu erhalten. Hier ist ein sehr einfach bisschen Grammatik, so dass ich ArithmeticParser.parse('2+2').value == 4 sagen kann.

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

Parsing 2+2 korrekt funktioniert, einen Knoten zurückkehrt. Allerdings Parsen 2 oder 22 kehrt nil.

Was habe ich verpasst?

War es hilfreich?

Lösung

Verstanden! Obwohl ich normalerweise die Frage löschen würde, würde ich nicht überrascht sein, wenn jemand anderes auch Treetop grundsätzlich verkennt, so dass ich diese Referenz hier verlassen werden.

Treetop einfach nicht durch die Regeln gehen, auf der Suche, für die man trifft. Stattdessen beginnt er bei der ersten Regel, und wenn die erste Regel nicht, paßt es sein muss, gezwungen zu Alternativen in Betracht ziehen. Daher wird am Ende der / number Regel erscheint additive müssen.

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top