我开始学习在ANTLR 4.5中编写词法分析器。从this page作为文档,我看到存在以下Lexer命令:more,pushMode(x),popMode,type(x),channel(x),mode(x),skip。
我无法清楚地了解他们的功能。以下是我对每个人所做的事情的理解:
这会跳过当前令牌中已读取的所有字符。过去的代币没有受到影响。
所以,如果词法分析器读过某个字符a
,接着读取b
,则对应
SOME_RULE : 'b' -> skip;
然后它会丢弃a
和b
并转到下一个标记。
我不确定这是做什么的。文档说,已阅读的文本不会被丢弃,但最终不会有什么令牌。假设我有
RULE_1 : 'a' -> more;
RULE_2 : 'b';
如果读取了a
,然后是b
,则生成的令牌会与RULE_2
对应,语义值为ab
或RULE_1 RULE_2
,或其他什么?
如果我有
RULE_1 : 'a' -> type(TOKEN_1);
RULE_2 : 'b';
只会将a
作为TOKEN_1
的语义值,或者将对应于非令牌的规则的所有字符(从最后一个标记开始)作为语义值?如果b
和a
到达,TOKEN_1
的值是a
还是ba
?
这会将模式切换为新的mode
。但是在这里,字符是否被读取直到交换点被保留或丢弃?令牌怎么样?每种模式都有一个单独的堆栈吗?
这与mode
有什么不同?是否已将已读取的字符推送到它将要进入的模式,这在mode
中不会发生?
突然出现了什么?如果我有
RULE_1 : 'a' -> popMode;
RULE_2 : 'b' ;
如果我收到b
和a
,popMode
只会返回a
,或ba
或令牌,如果有的话?为什么我偶尔因空堆栈而出错?
我无法找到解释。什么是频道?
有没有人可以通过示例来澄清每个命令的功能?
请告诉我这是否过于宽泛。
谢谢。
答案 0 :(得分:0)
这里有免费的教程The ANTLR Mega Tutorial。
除了skip
,theese命令非常专业,您可以在The Definitive ANTLR 4 Reference中找到使用它们的时间和原因,以及示例。