gpt4 book ai didi

java - 提取特定规则或标记前的隐藏评论内容(Antlr、Java)

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:22:24 25 4
gpt4 key购买 nike

我是 antlr 和 java 的新手,所以这可能是一个微不足道的问题(希望如此!)。我正在使用 antlr 3.4。我有词法分析器的语法:

lexer grammar MyLexer;

options {
language = Java;
}
COMMENT:
( '//' ~('\n'|'\r')* '\r'? '\n'
| '/*' .* '*/'
) {$channel=HIDDEN;};

WS: (' '
| '\t'
| '\r'
| '\n'
) {$channel=HIDDEN;};
COLLECTION: 'collection';
BRACE_OPEN: '{';
BRACE_CLOSE: '}';

另一个用于解析器:

parser grammar myParser;

options {
language = Java;
tokenVocab = myLexer;
}

collection_def
scope {
MyCollection currentCollection;
}
@init {
$collection_def::currentCollection = new MyCollection();
}
@after {

// There should be a comment preceding this rule. How to get the content of that comment into the commentContent variable?
$collection_def::currentCollection.setDescription(commentContent);

...
}
: COLLECTION BRACE_OPEN
...

BRACE_CLOSE;

词法分析器将评论发送到隐藏 channel 。但我希望解析器提取包含在特定规则(或特定标记,因为 COLLECTION 标记仅出现在上面的规则中)之前的注释中的文本。例如,我想要这个输入:

/* Text describing the collection */
collection {
item 1;
item 2;
}

要解析为 MyCollection 对象,其描述成员变量设置为“描述集合的文本”。

我该怎么做?

最佳答案

token 流包含所有 token ,包括隐藏 channel 上的 token 。您从解析器结果中获得的每个标记(例如,如果您使用 output = AST,则通过 tree.getToken())知道它在标记流中的位置(Token.getTokenIndex()).这是您定位和读取 token 之前的隐藏 token 所需的信息。

剩下您要做的就是将所有这些信息送到您需要使用它的地方。一种可能的方法是获取标记列表(如果您在词法分析器和解析器之间使用 CommonTokenStream,则通过 CommonTokenStream.getTokens())并将其传递给正在执行的任何方法评论的处理,或对结果进行一些后处理以向其中添加信息。

关于java - 提取特定规则或标记前的隐藏评论内容(Antlr、Java),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52363173/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com