Treetop: получение смещения узла

Я использую 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 ответ

Решение

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

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

Другие вопросы по тегам