Treetop: obtenir le décalage d'un noeud
Question
J'utilise arboricole pour générer un analyseur pour un langage de programmation.
Lors de l'analyse syntaxique réussie, je voudrais faire une analyse sémantique sur l'arbre de syntaxe. Idéalement, chaque fois que je rencontre un morceau de (sémantiquement) code invalide, je voudrais imprimer un message d'erreur qui inclut la ligne où l'erreur est survenue. Je sais que cela est possible parce que si je fais
parser = MyParser.new
tree = parser.parse("foobar")
p tree
Je reçois quelque chose comme
SyntaxNode offset=0, "foobar":
SyntaxNode offset=0, "f"
SyntaxNode offset=1, "o"
SyntaxNode offset=2, "o"
SyntaxNode offset=3, "b"
SyntaxNode offset=4, "a"
SyntaxNode offset=5, "r"
Pour l'essentiel, je voudrais un moyen d'accéder à l'attribut offset
d'un objet SyntaxNode
donné (ou sous-classe de celle-ci). Malheureusement, selon http://treetop.rubyforge.org/semantic_interpretation.html les seules méthodes disponibles sur Treetop::Runtime::SyntaxNode
sont terminal?
, nonterminal?
, text_value
et elements
, donc il ne semble pas être un moyen intégré de le faire.
La solution
Chaque SyntaxNode a une méthode « intervalle » qui est un objet Range Ruby. Le décalage est interval.start.
Liste de diffusion de soutien arboricole est à http://groups.google.com/group/treetop- dev