Cima: ottenere l'offset di un nodo
Domanda
sto usando Treetop per generare un parser per un piccolo linguaggio di programmazione.
Al momento del parsing di successo, mi piacerebbe fare qualche analisi semantica sul albero di sintassi. Idealmente, ogni volta che incontro un pezzo di (semanticamente) codice non valido, vorrei stampare un messaggio di errore che include la linea di cui si è verificato l'errore. So che questo è possibile perché se lo faccio
parser = MyParser.new
tree = parser.parse("foobar")
p tree
I ottenere qualcosa di simile
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"
Essenzialmente, vorrei un modo per accedere all'attributo offset
di un dato oggetto SyntaxNode
(o sottoclasse di esso). Purtroppo, secondo http://treetop.rubyforge.org/semantic_interpretation.html gli unici metodi disponibili su Treetop::Runtime::SyntaxNode
sono terminal?
, nonterminal?
, text_value
e elements
, quindi non sembra essere un built-in modo di fare questo.
Soluzione
Ogni SyntaxNode ha un metodo "intervallo", che è un oggetto rubino Range. Offset è interval.start.
mailing list di supporto di Cima di albero è a http://groups.google.com/group/treetop- dev