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