ANTLR4 中各种 Lexer 命令的功能。我的解释正确吗?他们每个人做什么?

Goo*_*eds 5 command antlr lexical-analysis lexer antlr4

我开始学习在 ANTLR 4.5 中编写词法分析器。从这个作为文档的页面,我看到存在以下 Lexer 命令:more、pushMode(x)、popMode、type(x)、channel(x)、mode(x)、skip。

我一直无法清楚地理解它们的功能。以下是我对他们每个人的作用的理解:

跳过

这会跳过当前标记中已读取的所有字符。过去的标记保持不变。

因此,如果词法分析器读取了某个字符a,接下来读取b,对应于

SOME_RULE : 'b' -> skip;
Run Code Online (Sandbox Code Playgroud)

然后它会丢弃ab并转到下一个令牌。

更多的

我不确定这是做什么的。文档说已读取的文本不会被丢弃,但没有说明最终会出现什么令牌。假设我有

RULE_1 : 'a' -> more;
RULE_2 : 'b';
Run Code Online (Sandbox Code Playgroud)

如果a读取 an ,然后读取 a b,则生成的标记是否对应于RULE_2语义值ab、 或RULE_1 RULE_2或其他值?

类型(x)

如果我有

RULE_1 : 'a' -> type(TOKEN_1);
RULE_2 : 'b';
Run Code Online (Sandbox Code Playgroud)

只会a被视为 的语义值TOKEN_1,还是将从最后一个标记开始,与不是标记的规则对应的所有字符都被视为语义值?如果 ab和 ana到达,TOKEN_1s 的值将是aor ba

众数(x)

这会将模式切换到新的mode. 但是在这里,读取到切换点的字符是保留还是丢弃?那么代币呢?每种模式都有单独的堆栈吗?

推送模式(x)

这与 有何不同mode?是否已经读取的字符被推送到它想要的模式,而这不会发生mode

弹出模式

弹出来的是什么?如果我有

RULE_1 : 'a' -> popMode;
RULE_2 : 'b' ;
Run Code Online (Sandbox Code Playgroud)

如果我得到 ab和 an a,popMode只会a返回 , 或ba, 或令牌(如果有)?为什么我偶尔会因堆栈空而出现错误?

通道(x)

我找不到对此的解释。什么是渠道?

如果可能的话,有人可以澄清每个命令的功能吗?

如果这太宽泛,请告诉我。

谢谢。

Ber*_*rdK -2

这里有一个免费教程ANTLR Mega 教程

除此之外skip,这些命令非常专业,您可以在The Definitive ANTLR 4 Reference中找到使用它们的时间和原因以及示例。