我正在研究Lexer和Parser语法,并使用ANTLR根据.G4文件创建解析器和Lexers。但是,我很困惑,因为PushMode和Popmode通常会做什么?
OPEN : '[' -> pushMode(BBCODE) ;
TEXT : ~('[')+ ;
mode BBCODE;
CLOSE : ']' -> popMode ;
在Lexer语法中,打开,PushMode,BBCode,Close和Popmode的意思是什么?我尝试搜索这些模式,但是对这些模式没有明确的定义和解释。
pushmode 和 popmode 用于所谓的"岛语法"或词汇模式。这些允许在同一文件中处理不同格式。基本思想是在看到某些字符序列时将Lexer切换在模式之间。
在您的语法示例中,当Lexer遇到[
时,它将从默认语法(即在任何mode <name>
之外定义的语法)切换到在
mode BBCODE;
和
CLOSE : ']' -> popMode ;
当它遇到]
时,它将切换回默认语法。
一个岛语法的一个示例将是Java代码中的Javadoc标签。
理论上,词汇模式也可用于在HTML内解析JavaScript。例如,主语法将定义HTML,但是当它遇到<script ...
标签时,它将切换到使用-> pushMode(javascript)
的JavaScript语法。当它遇到</script>
标签时,popMode
将返回"默认值"。html语法。
OPEN
和CLOSE
在您的示例中是'['
和']'
的词汇规则,可以在解析器语法中使用以提高可读性。而不是编写']' -> popMode
,您将编写CLOSE
。
如果您计划与Antlr4进行任何严重的信封,我强烈建议您阅读这本书:terence parr的确定性Antlr 4参考。