Treetop: получение смещения узла - PullRequest
1 голос
/ 07 ноября 2010

Я использую Treetop для генерации синтаксического анализатора для небольшого языка программирования.

При успешном разборе я бы хотел провести некоторый семантический анализ синтаксического дерева.В идеале, всякий раз, когда я сталкиваюсь с частью (семантически) неверного кода, я хотел бы распечатать сообщение об ошибке, которое включает строку, где произошла ошибка.Я знаю, что это возможно, потому что если я сделаю

parser = MyParser.new
tree = parser.parse("foobar")
p tree

, я получу что-то вроде

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"

По сути, я бы хотел получить доступ к атрибуту offset данного SyntaxNode объект (или его подкласс).К сожалению, согласно http://treetop.rubyforge.org/semantic_interpretation.html единственные методы, доступные в Treetop::Runtime::SyntaxNode, это terminal?, nonterminal?, text_value и elements, поэтому, кажется, нет встроенного способа выполненияэто.

1 Ответ

2 голосов
/ 17 ноября 2010

Каждый синтаксический узел имеет метод «интервал», который является объектом Ruby Range.Смещение: interval.start.

Список рассылки поддержки Treetop по адресу http://groups.google.com/group/treetop-dev

...