本文简单介绍 antlr4的基本知识,介绍了antlr4 语法中二义性及解决思路,anrlr4 可能出现的错误,以及错误定位和解决的办法。
简单介绍
ANTLR(Another Tool for Language Recognition)是一个开源的语法分析器生成工具。ANTLR4 语法分析器使用了一种名为自适应的 LL(*)
或者 ALL(*)
(读作 all star)的新技术,ALL(*)
是 ANTLR3 中 LL(*)
的扩展。
早期 Antlr 的 LL(*)
文法仍不支持“左递归”(left-recursion),这是所有LL剖析器]的局限,在左递归过程没有消耗掉任何token, LL 分析器很容易造成stack overflow。ANTLR4 的 ALL(*)
解决了左递归的问题,但是仍然不能处理间接左递归的情况1
antlr4 是用 java 编写的,所以首先保证环境中 java 环境已经正确安装。在官网或者 github 下载 antlr-4.7.1-complete.jar
,然后配置环境变量如下
# ANTLR
ANTLRPATH=/home/jona/software/antlr4/antlr-4.7.1-complete.jar
export CLASSPATH=.:$ANTLRPATH:$CLASSPATH
alias antlr4="java -Xmx1000M -cp "/home/jona/software/antlr4/antlr-4.7.1-complete.jar:$CLASSPATH" org.antlr.v4.Tool"
alias grun="java org.antlr.v4.gui.TestRig"
这样就能使用antlr4 工具了。antlr4 的 IDE 名为 antlrworks2
。使用图形工具编写语法规则会更加高效。
antlr4 虽然是用 java 语言写的,但是生成的目标语言可以支持 cpp, c sharp, go, java, php, python 和 swift。在源码目录 antl4/runtime
中可以查看得到。antlr4 支持上写文无关文法规则(context-free),能够根据语法规则生成相应的语法解析代码,开发者根据生成的代码,编写自己的逻辑。
antlr4 工具提供如下选项
-o ___ specify output directory where all output is generated
-lib ___ specify location of grammars, tokens files
-atn generate rule augmented transition network diagrams
-encoding ___ specify grammar file encoding; e.g., euc-jp
-message-format ___ specify output style for messages in antlr, gnu, vs2005
-long-messages show exception details when available for errors and warnings
-listener generate parse tree listener (default)
-no-listener don't generate parse tree listener
-visitor generate parse tree visitor
-no-visitor don't generate parse tree visitor (default)
-package ___ specify a package/namespace for the generated code
-depend generate file dependencies
-D<option>=value set/override a grammar-level option
-Werror treat warnings as errors
-XdbgST launch StringTemplate visualizer on generated code
-XdbgSTWait wait for STViz to close before continuing
-Xforce-atn use the ATN simulator for all predictions
-Xlog dump lots of logging info to antlr-timestamp.log
-Xexact-output-dir all output goes into -o dir regardless of paths/package
antlr4 提供了两种访问模式,一个是访问者 visitor 模式,一个是监听器 listener 模式,-visitor
和 -no-visitor
分别是打开访问者和关闭访问者的选项,-listener
和 -no-listener
分别是打开监听器和关闭监听器的模式。-long-messages
会显示详细的错误信息和告警信息。 -package
选项,会在代码生成时,制定代码所在的 names