Возможность явного определения «меток элементов правил» - PullRequest
0 голосов
/ 08 октября 2019

После https://github.com/antlr/antlr4/blob/master/doc/parser-rules.md#rule-element-labels существует ли способ явного добавления поля в объект контекста правила?

Мой вариант использования - это последовательность точек и идентификаторов:

dotIdentifierSequence
    : identifier dotIdentifierSequenceContinuation*
    ;

dotIdentifierSequenceContinuation
    : DOT identifier
    ;

Часто мы хотим иметь дело с «полным путем» структуры dotIdentifierSequence. Atm это означает использование DotIdentifierSequenceContext#getText. Однако DotIdentifierSequenceContext#getText обходит дерево, посещая каждый подузел, собирая текст.

Метки правил, как обсуждалось на этой странице документа, позволили бы мне сделать:

dotIdentifierSequence
    : i:identifier c+=dotIdentifierSequenceContinuation*
    ;

и добавить поля i и c в DotIdentifierSequenceContext. Однако, чтобы получить полный текст структуры, мне все равно придется посетить узел i и каждый узел c.

Что было бы замечательно - это иметь возможность определять строковое поле «полный текст последовательности» для DotIdentifierSequenceContext и DotIdentifierSequenceContinuationContext.

Возможно ли это сегодня каким-либо образом?

1 Ответ

0 голосов
/ 09 октября 2019

Единственным способом, который я смог найти, было следующее:


dotIdentifierSequence
    returns [String fullSequenceText]
    : (i=identifier { $fullSequenceText = _localctx.i.getText(); }) (c=dotIdentifierSequenceContinuation { $fullSequenceText += _localctx.c.fullSequenceText; })*
    ;

dotIdentifierSequenceContinuation
    returns [String fullSequenceText]
    : DOT (i=identifier { $fullSequenceText = "." + _localctx.i.getText(); })
    ;

, который работает, но, к сожалению, делает грамматику совершенно нечитаемой.

...