Question

Je suis en train d'obtenir la base de l'analyse syntaxique arboricole. Voici un peu simple de la grammaire afin que je puisse 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

Parsing 2+2 fonctionne correctement, le retour d'un nœud. Cependant, l'analyse syntaxique 2 ou retourne 22 nil.

Qu'est-ce que je manque?

Était-ce utile?

La solution

Je l'ai! Bien que je normalement supprimer la question, je ne serais pas surpris si quelqu'un d'autre aussi fondamentalement arboricole méprend, donc je vais laisser ce ici pour référence.

arboricole ne va pas seulement à travers les règles, à la recherche que l'on applique. Au lieu de cela, il commence à la première règle, et, si la première règle ne correspond pas, il doit être forcé à envisager des alternatives. Par conséquent, / number doit apparaître à la fin de la règle de 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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top