乐者为王

Do one thing, and do it well.

ANTLR 4权威参考读书笔记(14)

对于大多数语法而言,注释和空格都是语法分析器可以忽略的东西。如果我们不想让注释和空格在语法中到处都是,那么就需要让词法分析器把它们扔掉。不幸的是,这意味着任何后续的处理步骤都不能再访问注释和空格。保留但忽略注释和空格的秘密是把这些发送给语法分析器的记号放到一个“隐藏通道”中。因为语法分析器只能调谐到单个通道,所以我们可以把任何我们想要的东西传递到其它通道中。这里是如何实现的语法:

1
2
3
4
5
6
COMMENT
    : '/*' .*? '*/' -> channel(HIDDEN)    // match anything between /* and */
    ;

WS  : [ \r\t\n]+    -> channel(HIDDEN)
    ;

就像我们前面讨论过的-> skip那样,-> channel(HIDDEN)也是一个词法分析器指令。在这里,它设置那些记号的通道号码以便它们可以被语法分析器忽略。记号流仍然维护着原始的记号序列,但在传递记号给语法分析器时会略过隐藏通道中的记号。

Comments