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

时间:2017-04-17 20:04:50

标签: command antlr antlr4 lexer lexical-analysis

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

我无法清楚地了解他们的功能。以下是我对每个人所做的事情的理解:

跳过

这会跳过当前令牌中已读取的所有字符。过去的代币没有受到影响。

所以,如果词法分析器读过某个字符a,接着读取b,则对应

SOME_RULE : 'b' -> skip;

然后它会丢弃ab并转到下一个标记。

更多

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

RULE_1 : 'a' -> more;
RULE_2 : 'b';

如果读取了a,然后是b,则生成的令牌会与RULE_2对应,语义值为abRULE_1 RULE_2,或其他什么?

类型(x)的

如果我有

RULE_1 : 'a' -> type(TOKEN_1);
RULE_2 : 'b';

只会将a作为TOKEN_1的语义值,或者将对应于非令牌的规则的所有字符(从最后一个标记开始)作为语义值?如果ba到达,TOKEN_1的值是a还是ba

模式(x)的

这会将模式切换为新的mode。但是在这里,字符是否被读取直到交换点被保留或丢弃?令牌怎么样?每种模式都有一个单独的堆栈吗?

pushMode(x)的

这与mode有什么不同?是否已将已读取的字符推送到它将要进入的模式,这在mode中不会发生?

popMode

突然出现了什么?如果我有

RULE_1 : 'a' -> popMode;
RULE_2 : 'b' ;

如果我收到bapopMode只会返回a,或ba或令牌,如果有的话?为什么我偶尔因空堆栈而出错?

信道(x)的

我无法找到解释。什么是频道?

有没有人可以通过示例来澄清每个命令的功能?

请告诉我这是否过于宽泛。

谢谢。

1 个答案:

答案 0 :(得分:0)

这里有免费的教程The ANTLR Mega Tutorial

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