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

Cod*_*erX 1 parsing antlr lexer antlr4

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

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

mode BBCODE;

CLOSE               : ']' -> popMode ; 
Run Code Online (Sandbox Code Playgroud)

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

use*_*638 8

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

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

mode BBCODE;
Run Code Online (Sandbox Code Playgroud)

CLOSE               : ']' -> popMode ;
Run Code Online (Sandbox Code Playgroud)

当它遇到时,]它会切换回默认语法。

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

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

OPEN并且CLOSE在你的例子是词法规则'['']'可在语法分析器中使用以提高可读性。而不是写作']' -> popMode,你会写CLOSE

如果您计划认真对待 ANTLR4,我强烈建议您阅读这本书:Terence Parr 的 The Definitive ANTLR 4 Reference