Посетитель Antrl по грамматике с директивой компилятора - PullRequest
0 голосов
/ 26 апреля 2018

Я пытаюсь получить директиву компилятора в анализаторе verilog, который дает мне истинное имя файла / путь и истинную текущую строку в необработанном файле.

Язык Verilog нуждается в проходе предварительной обработки, который у меня есть, но во время посещения я должен знать текущее имя файла (которое не может быть изменено с помощью директивы include) и, следовательно, истинную текущую строку в необработанном файле.

Часть предварительной обработки добавляет директиву verilog `line , которая указывает текущий файл и строку. Затем я отправляю предварительно обработанный буфер в antlr Lexer, анализирую и извлекаю всю информацию verilog с посетителем. Я должен сохранить директиву строки компилятора verilog в описании грамматики verilog:

Preprocessing_line  
: '`line ' Decimal_number String Decimal_number '\n' -> channel(2)  
;

Теперь я не знаю, как получить информацию об этом выделенном канале в любой точке посетителя? Целевым языком для этого синтаксического анализатора является Python3.

1 Ответ

0 голосов
/ 26 апреля 2018

Учитывая, что токены Preprocessing_line могут не иметь надежного отношения к токенам дерева синтаксического анализа (различные компиляторы Verilog могут немного разбираться в том, куда они вставляют контрольные строки), самое простое решение - создать временный индекс до к прогулке посетителя.

То есть, после анализа предварительно обработанного источника Verilog, сделайте быстрый проход по всему потоку токенов (BufferedTokenStream#getTokens), выбрав токены Preprocessing_line и построив индекс current_line -> original_line.

Затем в любом посещенном контексте изучите базовые токены (ParserRuleContext#getStart, #getStop, #getSourceInterval), чтобы найти их current_line (Token#getLine)

...