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
Vous devez vous connecter pour publier un commentaire.
Malheureusement, Treetop la documentation de suce. Beaucoup. Et les exemples sur le site ne sont pas utiles. J'ai trouvé que dzone a une assez grande collection de treetop grammaires :
Treetop grammaires
bonne chance! peut-être que vous pourriez écrire quelque article/tutoriel après vous avez terminé ?
Malheureusement, la page est désactivé pour une raison quelconque.
La Page est désactivée
OriginalL'auteur Geo
Que vous pourriez apprécier Paul Battley est agréable, simple tutoriel
Mise en route avec Treetop
De départ avec un minimum de grammaire, il montre comment créer un analyseur, puis à travers un couple d'itérations ajoute juste un peu de fonctionnalité. C'était juste assez pour me sortir des starting-blocks.
OriginalL'auteur dankingsbury
Roland Swingler a donné une présentation sur les Arbres pour LRUG:
http://skillsmatter.com/podcast/ajax-ria/treetop
que j'ai trouvé utile de commencer.
OriginalL'auteur Rare Pleasures
D'agrumes est un beaucoup plus léger alternative à la cime des arbres: http://github.com/mjijackson/citrus
OriginalL'auteur phaedryx
J'ai suivi ce Treetop Tutoriel D'Introduction il y a quelques années à comprendre les principes de base de la cime des arbres.
Et puis Une introduction rapide à écrire un analyseur syntaxique avec Treetop, utile pour moi, parce qu'il explique comment la carte de la syntaxe de nœuds de l'arborescence de ruby instances de classe.
OriginalL'auteur ergo sum cogito
J'ai juste commencé à expérimenter avec la Cime des arbres.
J'ai essayé le changement de
à
Et il semble fonctionner.
OriginalL'auteur DMisener
La Treetop docs semblent partir du principe que vous connaissez déjà une bonne quantité sur l'analyse de l'expression des grammaires (Peg). Treetop est entièrement basé sur les Chevilles. Chevilles sont plus que de simples Treetop bien, c'est à dire qu'ils sont utilisés dans d'autres bibliothèques d'analyse. Dans l'apprentissage de la Cime des arbres, je l'ai trouvé très utile d'étudier les Chevilles en général. Qui ont permis de combler beaucoup de lacunes dans la documentation.
OriginalL'auteur rlkw1024
C'est un bug. Inutile de parenthèses autour de la règle pour un entier causes de la construction d'un module supplémentaire pour contenir la définition de la fonction eval, et le module ne pas être mélangé dans le nœud, de sorte 'eval' n'est pas disponible. Vous pouvez voir clairement si l'on compare le code Ruby (générés à l'aide du tt de commande) pour les versions avec et sans ces parenthèses.
OriginalL'auteur cliffordheath