能够明确定义“规则元素标签”

时间:2019-10-08 16:38:47

标签: antlr antlr4

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*
    ;

并将字段ic添加到DotIdentifierSequenceContext。但是,要获取完整结构的文本,我仍然必须访问i节点和每个c节点。

很棒的是能够为DotIdentifierSequenceContext和DotIdentifierSequenceContinuationContext定义一个“完整序列文本”字符串字段。

今天有可能吗?

1 个答案:

答案 0 :(得分:0)

我能找到的唯一方法是:


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(); })
    ;

这是可行的,但不幸的是使语法难以理解。