Domanda

Sto cercando di ottenere la base di Treetop analisi. Ecco un semplice po 'di grammatica in modo che posso dire 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

Analisi 2+2 funziona correttamente, la restituzione di un nodo. Tuttavia, l'analisi 2 o ritorna 22 nil.

Cosa mi sono perso?

È stato utile?

Soluzione

Ci sono! Anche se mi piacerebbe normalmente cancellare la domanda, non sarei sorpreso se qualcun altro anche fraintende fondamentalmente Cima di albero, quindi lascio questo qui come riferimento.

Cima non basta andare attraverso le regole, alla ricerca di cui uno si applica. Invece, inizia la prima regola, e, se la prima regola non corrisponde, deve essere costretto a prendere in considerazione delle alternative. Pertanto, / number deve apparire alla fine della regola 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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top