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)
然后它会丢弃a
和b
并转到下一个令牌。
我不确定这是做什么的。文档说已读取的文本不会被丢弃,但没有说明最终会出现什么令牌。假设我有
RULE_1 : 'a' -> more;
RULE_2 : 'b';
Run Code Online (Sandbox Code Playgroud)
如果a
读取 an ,然后读取 a b
,则生成的标记是否对应于RULE_2
语义值ab
、 或RULE_1 RULE_2
或其他值?
如果我有
RULE_1 : 'a' -> type(TOKEN_1);
RULE_2 : 'b';
Run Code Online (Sandbox Code Playgroud)
只会a
被视为 的语义值TOKEN_1
,还是将从最后一个标记开始,与不是标记的规则对应的所有字符都被视为语义值?如果 ab
和 ana
到达,TOKEN_1
s 的值将是a
or ba
?
这会将模式切换到新的mode
. 但是在这里,读取到切换点的字符是保留还是丢弃?那么代币呢?每种模式都有单独的堆栈吗?
这与 有何不同mode
?是否已经读取的字符被推送到它想要的模式,而这不会发生mode
?
弹出来的是什么?如果我有
RULE_1 : 'a' -> popMode;
RULE_2 : 'b' ;
Run Code Online (Sandbox Code Playgroud)
如果我得到 ab
和 an a
,popMode
只会a
返回 , 或ba
, 或令牌(如果有)?为什么我偶尔会因堆栈空而出现错误?
我找不到对此的解释。什么是渠道?
如果可能的话,有人可以澄清每个命令的功能吗?
如果这太宽泛,请告诉我。
谢谢。
Ber*_*rdK -2
这里有一个免费教程ANTLR Mega 教程。
除此之外skip
,这些命令非常专业,您可以在The Definitive ANTLR 4 Reference中找到使用它们的时间和原因以及示例。