J'essaie de m'enseigner moi-même le générateur de grammaire Treetop de Ruby. Je constate que non seulement la documentation est tristement rare pour le «meilleur», mais qu'elle ne semble pas fonctionner aussi intuitivement que je l'espérais. En gros, j'adorerais un meilleur tutoriel que les docs sur site ou la vidéo, s'il y en a un.Learning Treetop
Au niveau inférieur, voici une grammaire que je ne peux pas travailler du tout:
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 charge et exécuter certaines assertions dans un objet de test très simple, je trouve:
assert_equal @parser.parse('3.14').eval,3.14
fonctionne très bien, tandis que
assert_equal @parser.parse('3').eval,3
soulève l'erreur: NoMethodError: méthode privée `eval » a appelé à #
Si j'inverse l'entier et flotte sur la description, les entiers et les flottants me donnent cette erreur. Je pense que cela peut être lié à lookahead limité, mais je ne trouve aucune information dans l'un des docs pour même couvrir l'idée d'évaluer dans le contexte "ou"
Un peu plus d'informations qui peuvent aider. Voici des informations sur pp pour ces deux blocs parse().
Le flotteur:
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 ... Notez qu'il semble avoir été défini pour suivre la règle entière, mais pas pris la méthode eval():
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 eu mon problème particulier de travail, mais je n'ai aucune idée pourquoi:
rule integer
('+'/'-')? plain_digits
{
def eval
text_value.to_i
end
}
end
Cela n'a aucun sens avec les documents présents, mais le simple fait de supprimer les parenthèses supplémentaires fait que la correspondance inclut la classe Integer1 ainsi que Integer0. Integer1 est apparemment la classe qui contient la méthode eval(). Je n'ai aucune idée de pourquoi c'est le cas. Je suis toujours à la recherche de plus d'informations sur Treetop.
Merci;) Je vais comprendre à travers ce – user54650
bonne chance! peut-être que vous pourriez écrire un article/tutoriel après que vous avez terminé? – Geo
Malheureusement, la page est désactivée pour une raison quelconque. –