Arhn - архитектура программирования

Определение контекста в позиции в файле с помощью ANTLR4

Я пытаюсь написать расширение языка для кода VS в JavaScript, и мне кажется, что я что-то упускаю.

У меня есть Lexer.g4 и Parser.g4 для моего языка, и я могу создать дерево, используя их.

Моя проблема в том, что VS Code API дает мне документ и позицию в этом документе (строка #, символ #). Ни в одном из примеров, которые я просмотрел для ANTLR4, я не могу найти какие-либо сгенерированные функции, которые занимают позицию в файле и возвращают узлы дерева в этой позиции.

Я хочу знать, например, что курсор находится на имени функции.

Должен ли я проходить все дерево и проверять положение токенов, чтобы увидеть, охватывают ли они положение, в котором я нахожусь в редакторе? Или, может быть, я использую не тот инструмент для работы? Я чувствую, что, вероятно, упускаю что-то более фундаментальное.


  • «Должен ли я проходить по всему дереву и проверять положение токенов?» — вот что я узнаю до сих пор. Сгенерированный код не дает других альтернатив ИМХО. 26.11.2019

Ответы:


1

Да, вам нужно пройтись по дереву синтаксического анализа, чтобы найти контекст в заданной позиции. Это довольно простая задача, и вы можете увидеть ее в действии в моем Расширение ANLTR4 для vscode. Есть несколько функций, возвращающих что-то полезное для данной позиции. Например этот:

/**
 * Returns the parse tree which covers the given position or undefined if none could be found.
 */
function parseTreeFromPosition(root: ParseTree, column: number, row: number): ParseTree | undefined {
    // Does the root node actually contain the position? If not we don't need to look further.
    if (root instanceof TerminalNode) {
        let terminal = (root as TerminalNode);
        let token = terminal.symbol;
        if (token.line != row)
            return undefined;

        let tokenStop = token.charPositionInLine + (token.stopIndex - token.startIndex + 1);
        if (token.charPositionInLine <= column && tokenStop >= column) {
            return terminal;
        }
        return undefined;
    } else {
        let context = (root as ParserRuleContext);
        if (!context.start || !context.stop) { // Invalid tree?
            return undefined;
        }

        if (context.start.line > row || (context.start.line == row && column < context.start.charPositionInLine)) {
            return undefined;
        }

        let tokenStop = context.stop.charPositionInLine + (context.stop.stopIndex - context.stop.startIndex + 1);
        if (context.stop.line < row || (context.stop.line == row && tokenStop < column)) {
            return undefined;
        }

        if (context.children) {
            for (let child of context.children) {
                let result = parseTreeFromPosition(child, column, row);
                if (result) {
                    return result;
                }
            }
        }
        return context;

    }
}
26.11.2019
Новые материалы

Коллекции публикаций по глубокому обучению
Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

Представляем: Pepita
Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

Советы по коду Laravel #2
1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

3 способа решить квадратное уравнение (3-й мой любимый) -
1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

Создание VR-миров с A-Frame
Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

Демистификация рекурсии
КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..