ANTLR是什么
ANTLR 即 ANother Tool for Language Recognition
- 框架,可以通过包含Java、C++、或C# Action的语法描述来构造语言识别器,编译器和解释器。
- 本身是Java 开发的
- 类似工具Lex、YACC,JavaCC等。
- 使用上下文无关的描述语言。在Antlr中可以自动生成Lexer、Parser和Tree Parser。
应用场景
- 编程语言处理,DSL。
- 本文处理:可以完成正则表达式无法完成的工作(如:左右括号匹配)。
Hello World
可以参考Getting Started with ANTLR v4
准备材料
- antlr-4.5.1-complete.jar
环境搭建
设置CLASSPATH
CLASSPATH=.;%JAVA_HOME%\lib\rt.jar;%TOOL_HOME%\antlr-4.0-complete.jar;
注:前面的 .; 不能少,否则后面的grun无法执行。
创建bat并添加到Path
antlr4.bat
java org.antlr.v4.Tool %*
grun.bat
java org.antlr.v4.gui.TestRig %*
验证
>java org.antlr.v4.Tool
ANTLR Parser Generator Version 4.5.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
...
国际惯例,Hello World
首先,需要写Hello.g4文件,内容如下
grammar Hello;
r : 'hello' ID ; // 匹配关键字 hello 以及之后的 ID
ID : [a-z]+ ; // 匹配小写字符串
WS : [ \t\r\n]+ -> skip ; // 跳过空格、空行、Tab
输入
> antlr4 Hello.g4 #生成java文件
输入
> javac Hello*.java #编译java文件
可以测试了,输入
> grun Hello r -tree
hello world
^Z
(r hello world)
#The -tree option prints the parse tree in LISP notation.
> grun Hello r -gui
hello world
^Z
#show parse tree inspector gui
注: 执行grun时可能出现 Can’t load Hello as lexer or parser,是因为CLASSPATH设置问题
注: 这些操作都可以使用antlrWorks实现
语法简介
首先要定义Antlr文法文件,V4版本以.g4为文件后缀,以前版本用.g。
文件的头部是 grammar 关键字,定义文法的名字,必须和文件名称相同。
grammar Hello;
语法定义
规定语法定义符号的第一个字母小写
r : 'hello' ID ;
词法定义
词法定义符号(Token)的第一个字母大写
ID : [a-z]+ ;
WS : [ \t\r\n]+ -> skip ;
注: 这些在 AntlrWorks 中都可以做到可视化。
其他
除了 ANTLR 之外,还有大名鼎鼎的 JetBrains 开发的 MPS,Eclipse 的 TEXT。
网友评论