【问题标题】:What does pushMode, popMode, mode, OPEN and CLOSE mean in the lexer grammar?lexer 语法中的 pushMode、popMode、mode、OPEN 和 CLOSE 是什么意思?
【发布时间】:2017-11-26 13:23:55
【问题描述】:

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

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

mode BBCODE;

CLOSE               : ']' -> popMode ; 

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

【问题讨论】:

标签: parsing antlr antlr4 lexer


【解决方案1】:

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

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

mode BBCODE;

CLOSE               : ']' -> popMode ;

遇到]会切换回默认语法。

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

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

OPENCLOSE 在您的示例中是 '['']' 的词法规则,可用于解析器语法以提高可读性。不要写']' -> popMode,而是写CLOSE

如果您计划认真地使用 ANTLR4,我强烈建议您阅读这本书:The Definitive ANTLR 4 Reference by Terence Parr

【讨论】:

    猜你喜欢
    • 2018-06-05
    • 2022-06-22
    • 2013-11-02
    • 1970-01-01
    • 2016-10-27
    • 1970-01-01
    • 2020-06-01
    • 2018-05-12
    • 2017-04-13
    相关资源
    最近更新 更多