我已经开始学习在ANTLR 4.5中编写一个词法分析器。从this page,作为文档,我看到以下Lexer命令存在:more,pushMode(x),popMode,type(x),channel(x),mode(x),skip。ANTLR4中的各种Lexer命令的功能。我的解释是否正确?他们每个人做什么?
我还没有能够清楚地了解它们的功能。以下是我的他们每个人的理解不:
跳过
这跳过了已在当前令牌被读取的所有字符。过去的令牌不变。
所以,如果词法分析器已经看了一些人物a
,它下一步读取b
,对应于
SOME_RULE : 'b' -> skip;
那么就会丢掉两a
和b
并转到下一个标记。
更多
我不确定这是干什么的。该文件说,已阅读的文本将不会被丢弃,但什么标记最终都不会在那里。假设我有
RULE_1 : 'a' -> more;
RULE_2 : 'b';
如果a
被读取,然后b
,将产生的令牌对应于RULE_2
与语义值ab
,或RULE_1 RULE_2
,还是其他什么东西?
类型(X)
如果非要
RULE_1 : 'a' -> type(TOKEN_1);
RULE_2 : 'b';
只会a
被取为TOKEN_1
语义值,或将对应于未标记的规则的所有字符,从一最后一个标记,被视为语义值?如果一个b
和一个a
到达,将TOKEN_1
的值是a
或ba
?
模式(x)的
这将模式切换到一个新的mode
。但是,在这里,是直到切换点保存或丢弃的字符?什么是令牌?每种模式都有单独的堆栈吗?
pushMode(X)
这是如何从mode
有什么不同?这种情况是否已将已读字符推送到它将要进入的模式,这在mode
中不会发生?
popMode
什么弹出?如果我有
RULE_1 : 'a' -> popMode;
RULE_2 : 'b' ;
如果我得到一个b
和a
,将popMode
原因只a
退换,或ba
,或令牌,如果有的话?为什么我偶尔会因为空栈而发生错误?
channel(x)
我找不到解释。什么是频道?
任何人都可以请澄清这些命令中的每一个的功能,如果可能的话与例子?
请让我知道这是否太广泛。
谢谢。