美文网首页
DSL从入门到放弃 - ANTLR之HelloWorld

DSL从入门到放弃 - ANTLR之HelloWorld

作者: 小校有来有去 | 来源:发表于2019-02-20 23:00 被阅读0次

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。

相关文章

网友评论

      本文标题:DSL从入门到放弃 - ANTLR之HelloWorld

      本文链接:https://www.haomeiwen.com/subject/gznkyqtx.html