L'Apprentissage Treetop

Je suis en train de m'enseigner Ruby Treetop grammaire génératrice. J'ai constaté que non seulement la documentation est malheureusement limité pour le "meilleur" un là-bas, mais il ne semble pas fonctionner comme intuitivement comme je l'avais espéré.

Sur un haut niveau, j'aimerais vraiment un meilleur tutoriel que le site docs ou de la vidéo, si il y en a un.

Sur un niveau plus bas, voici une grammaire je ne peut pas se rendre au travail à tous:

grammar SimpleTest

  rule num
    (float / integer)
  end

  rule float
   (
    (( '+' / '-')? plain_digits '.' plain_digits) /
    (( '+' / '-')? plain_digits ('E' / 'e') plain_digits ) /
    (( '+' / '-')? plain_digits '.') / 
    (( '+' / '-')? '.' plain_digits) 
   ) {
      def eval
        text_value.to_f
      end
   }
  end

  rule integer
    (( '+' / '-' )? plain_digits) {
      def eval
        text_value.to_i
      end
    }
  end

  rule plain_digits
    [0-9] [0-9]*      
  end

end

Quand je le charger et d'exécuter certaines affirmations dans un très simple objet de test, je trouve:

assert_equal @parser.parse('3.14').eval,3.14

Fonctionne très bien, tandis que

assert_equal @parser.parse('3').eval,3

génère l'erreur: NoMethodError: méthode privée `eval' a appelé pour #

Si j'inverse entiers et à virgule flottante sur le descriptif, les deux nombres entiers et décimaux donne-moi de cette erreur. Je pense que cela peut être lié à la limité d'anticipation, mais je ne trouve aucune information, sur tous les docs pour couvrir même l'idée de l'évaluation dans le "ou" contexte

Un peu plus d'infos pour vous aider. Voici pp informations pour ceux parse() bloque.

Le float:

SyntaxNode+Float4+Float0 offset=0, "3.14" (eval,plain_digits):
  SyntaxNode offset=0, ""
  SyntaxNode+PlainDigits0 offset=0, "3":
    SyntaxNode offset=0, "3"
    SyntaxNode offset=1, ""
  SyntaxNode offset=1, "."
  SyntaxNode+PlainDigits0 offset=2, "14":
    SyntaxNode offset=2, "1"
    SyntaxNode offset=3, "4":
      SyntaxNode offset=3, "4"

L'Entier... à noter qu'il semble avoir été définis de manière à suivre l'entier de la règle, mais pas pris le eval() méthode:

SyntaxNode+Integer0 offset=0, "3" (plain_digits):
  SyntaxNode offset=0, ""
  SyntaxNode+PlainDigits0 offset=0, "3":
    SyntaxNode offset=0, "3"
    SyntaxNode offset=1, ""

Mise à jour:

J'ai obtenu mon problème particulier, mais je n'ai aucune idée de pourquoi:

  rule integer
    ( '+' / '-' )? plain_digits
     {
      def eval
        text_value.to_i
      end
    }
  end

Cela n'a aucun sens avec les docs qui sont présents, mais juste en enlevant l'excès de parenthèses fait le match inclure la Integer1 classe ainsi que Integer0. Integer1 est apparemment la classe la tenue de la fonction eval() de la méthode. Je n'ai aucune idée de pourquoi c'est le cas.

Je suis toujours à la recherche pour plus d'informations sur la cime des arbres.

OriginalL'auteur user54650 | 2009-02-06