ANTLR v4初体验

  |   评论   |   浏览

背景

再次用到了ANTLR,重新记录一下。

快速入门

环境配置

安装

pip3 install antlr4-tools

运行,需要Java 11+版本。

antlr4 ANTLR Parser Generator Version 4.11.1 -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

语法文件

下面这个语法文件,记录了整数的加减乘除,以及括号语法。文件Expr.g4内容如下:

grammar Expr; prog: expr EOF ; expr: expr ('*'|'/') expr | expr ('+'|'-') expr | INT | '(' expr ')' ; NEWLINE : [\r\n]+ -> skip; INT : [0-9]+ ;

使用

antlr4-parse Expr.g4 prog -tree 10+20*30 ^D

输出

(prog:1 (expr:2 (expr:3 10) + (expr:1 (expr:3 20) * (expr:3 30))) <EOF>)

可视化输出

$ antlr4-parse Expr.g4 prog -gui 10+20*30 ^D

结果

image.png

生成parser代码

$ antlr4 Expr.g4 $ ls Expr*.java ExprBaseListener.java ExprLexer.java ExprListener.java ExprParser.java

也可以生成 C++ 代码

$ antlr4 -Dlanguage=Cpp Expr.g4 $ ls Expr*.cpp Expr*.h ExprBaseListener.cpp ExprLexer.cpp ExprListener.cpp ExprParser.cpp ExprBaseListener.h ExprLexer.h ExprListener.h ExprParser.h

参考

  1. Getting Started with ANTLR v4
  2. Antlr4 案例1: 通过 hello语法 来了解 Antlr4开发流程