pushMode、popMode、mode、OPEN 和 CLOSE 在词法分析器语法中是什么意思?

What does pushMode, popMode, mode, OPEN and CLOSE mean in the lexer grammar?

我正在研究词法分析器和解析器语法,并使用 ANTLR 创建基于 .g4 文件的解析器和词法分析器。但是,我很困惑 pushMode 和 popMode 通常做什么?

OPEN                : '[' -> pushMode(BBCODE) ;
TEXT                : ~('[')+ ;

mode BBCODE;

CLOSE               : ']' -> popMode ; 

OPEN、pushMode、BBCODE、CLOSE 和 popMode 在词法分析器语法中的含义是什么?我尝试搜索这些模式,但没有明确的定义和解释。

pushModepopMode 用于所谓的“岛屿语法”或词法模式。这些允许处理同一文件中的不同格式。基本思想是让词法分析器在看到某些字符序列时在模式之间切换。

在您的语法示例中,当词法分析器遇到 [ 时,它将从默认语法(即在任何 mode <name> 之外定义的语法)切换到

之间定义的语法
mode BBCODE;

CLOSE               : ']' -> popMode ;

遇到]会切换回默认语法

孤岛语法的一个例子是Java代码中的Javadoc标签。

理论上,词法模式也可用于解析 JavaHTML 中的脚本。例如,主语法会定义 HTML,但是当它遇到 <script ... 标记时,它会切换到 Java 带有 -> pushMode(javascript) 的脚本语法。当它遇到 </script> 标签时,它会 popMode 到 return 回到“默认” HTML 语法。

您示例中的

OPENCLOSE'['']' 的词法规则,可用于解析器语法以提高可读性。你应该写 CLOSE.

而不是写 ']' -> popMode

如果你打算认真学习 ANTLR4,我强烈推荐阅读这本书:The Definitive ANTLR 4 Reference by Terence Parr