首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

antlr 5分钟入门

2013-07-16 
antlr 五分钟入门五分钟入门antlr引言我在设计一个规则产品引擎中,使用了antlr(一个开源组件)对规则脚本进

antlr 五分钟入门

五分钟入门antlr

引言

我在设计一个规则产品引擎中,使用了antlr(一个开源组件)对规则脚本进行编译为java 对象。这样业务人员在规则脚本中,只要关注业务逻辑就可以了。

Antlr = 定义我这个语言是什么样子的。

Hello world

?

?

?

?

?

下面的一个陈述句,只有主谓宾三部分,

主语是代词,My|your|his 三选一,加上‘age’,

谓语是is,

宾语是数字,定义的语法:

?

语法文件Age.g:

grammar Age;

?

ageSentence:

WHOSE 'age' 'is'? INT

?

WHOSE:

'My'|'your'|'his'

;

?

INT:

('0'..'9')+;

?

//? white space

WS? :? (' '|'\r'|'\t'|'\u000C'|'\n')+ {skip();};

那么 My age is 40 是语法正确,My name is 40则是语法错误。

????? 定义动作

语法识别出来后,作些什么,使用{}将动作括起来

Hello world

?

?

?

?

?

语法文件Age.g:

grammar Age;

?

ageSentence:

WHOSE 'age' 'is'? INT

?

WHOSE:

'My'|'your'|'his'

;

?

INT:

('0'..'9')+;

?

//? white space

WS? :? (' '|'\r'|'\t'|'\u000C'|'\n')+ {skip();};

?

课堂笔记

?

?

?

?

?

由此可见,定义动作的作用就是将一大堆文字转换为一大堆 java 实例

?

课堂提问

?

?

?

?

涉及到计算引擎的:我的一个规则脚本会对每一笔交易流水,都要重新进行语法解析,以便形成java 实例么?

不是。在初始化阶段,对规则脚本进行语法解析,形成java 实例,因为这个脚本不变,所以解析出的java 实例可以反复使用,只是对每笔业务交易,给这些实例注入不同的交易数据而已。

????? 根据语法文件生成java解析类

Set CLASSPATH=%CLASSPATH%; <你的antlr-3.2.jar文件>

java org.antlr.Tool Age.g

会生成 AgeParser.java等文件

????? 运行片段

文件Test.java:

import org.antlr.runtime.*;

public class Test {

public static void main(String[] args) throws Exception {

// create a CharStream that reads from standard input

ANTLRInputStream input = new ANTLRInputStream(System.in);

// create a lexer that feeds off of input CharStream

AgeLexer lexer = new AgeLexer(input);

// create a buffer of tokens pulled from the lexer

CommonTokenStream tokens = new CommonTokenStream(lexer);

// create a parser that feeds off the tokens buffer

AgeParser parser = new AgeParser(tokens);

// begin parsing at rule r

parser.ageSentence();

}

}

?

?

编译:

Javac *.java

?

运行:

java Test

输入:

his age is 18

^Z

输出:

the sentence 主: his age 谓语: is 宾语: 18

?

?

用途

任何需要处理文本的场合

课堂思考

?

?

?

?

?

关于xml

也可以把xml当做一种语言,写个xml的语法(相当于xml的结构定义dtd,xsd),就可以对xml进行解析了。

<project>

{

???????? This.project = new Project();

???????? This.rules = new ArrayList();

}

???????? <rule>

?????????????????? {

??????????????????????????? Rule r = new Rule();

}

?????????????????? …

???????? </rule>

???????? {

?????????????????? This.rules.add(r);

}

?

</project>

?

但一般来说,xml作为一种结构严格的数据较为合适,作为语言,也可以使用类似自然语言的写法,如:

This is a project

{

???????? This.project = new Project();

???????? This.rules = new ArrayList();

?

}

,It has a rule

???????? {

?????????????????? Rule r = new Rule();

?????????????????? This.rules.add(r);

}

?…

延伸阅读

这里仅抛砖引玉,若要进一步了解antlr,

访问官网 www.antlr.org

?

书籍:

The Definitive Antlr Reference: Building Domain-Specific Languages

Terence Parr (作者)

出版社: Pragmatic Bookshelf

?

附件

附有示例代码。代码可与我联系15367481@qq.com

热点排行