在Antlr4中是否可以将令牌拆分为2?

在Antlr4中是否可以将令牌拆分为2?,antlr,antlr4,Antlr,Antlr4,为了突出显示,我需要能够将一个令牌拆分为2个,我有一个如下所示的令牌: ID_INTERP: '$' IDEN; 但是我想突出显示与标识符不同的美元符号,那么是否可以将此令牌分成两部分,一部分带有美元符号,另一部分带有标识符?我知道我可以在某些条件下将整个令牌更改为不同的类型,但我希望能够添加和更改它包含的文本,基本上是更改令牌流,而不是说 ID_INTERP[“$foo”] 它会看到这样的情况: ID_INTERP: '$' IDEN; 美元符号[“$”]IDEN[“foo”]通过扩展令牌

为了突出显示,我需要能够将一个令牌拆分为2个,我有一个如下所示的令牌:

ID_INTERP: '$' IDEN;
但是我想突出显示与标识符不同的美元符号,那么是否可以将此令牌分成两部分,一部分带有美元符号,另一部分带有标识符?我知道我可以在某些条件下将整个令牌更改为不同的类型,但我希望能够添加和更改它包含的文本,基本上是更改令牌流,而不是说

ID_INTERP[“$foo”]

它会看到这样的情况:

ID_INTERP: '$' IDEN;

美元符号[“$”]IDEN[“foo”]

通过扩展令牌源,可以为给定的匹配发出多个令牌。我用这个想法为lexer规则
DOT\u标识符
()生成了2个令牌。在匹配时,它推送一个点标记并将结果设置为
标识符
,有效地为单个规则创建两个单独的标记

Sam Harwell描述了使用一些Java代码扩展lexer的技术。这是我使用的一个可能的C++实现:

std::unique_ptr MySQLBaseLexer::nextToken(){
//首先使用挂起的令牌响应下一个令牌请求(如果有)。
如果(!\u pendingTokens.empty()){
自动挂起=std::move(_pendingTokens.front());
_pendingTokens.pop_front();
等待返回;
}
//让主lexer类运行下一个令牌识别。
//这可能会再次创建其他令牌。
自动下一步=Lexer::nextToken();
如果(!\u pendingTokens.empty()){
自动挂起=std::move(_pendingTokens.front());
_pendingTokens.pop_front();
_暂停。向后推(标准::移动(下一步));
等待返回;
}
下一步返回;
}

可以通过扩展令牌源为给定匹配发出多个令牌。我用这个想法为lexer规则
DOT\u标识符
()生成了2个令牌。在匹配时,它推送一个点标记并将结果设置为
标识符
,有效地为单个规则创建两个单独的标记

Sam Harwell描述了使用一些Java代码扩展lexer的技术。这是我使用的一个可能的C++实现:

std::unique_ptr MySQLBaseLexer::nextToken(){
//首先使用挂起的令牌响应下一个令牌请求(如果有)。
如果(!\u pendingTokens.empty()){
自动挂起=std::move(_pendingTokens.front());
_pendingTokens.pop_front();
等待返回;
}
//让主lexer类运行下一个令牌识别。
//这可能会再次创建其他令牌。
自动下一步=Lexer::nextToken();
如果(!\u pendingTokens.empty()){
自动挂起=std::move(_pendingTokens.front());
_pendingTokens.pop_front();
_暂停。向后推(标准::移动(下一步));
等待返回;
}
下一步返回;
}

您的答案更完整,有一个很好的参考!非常感谢。这就是我需要的。你的答案更完整,有一个很好的参考!非常感谢。这就是我需要的。