antlr 五分钟入门

五分钟入门antlr

引言

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

Antlr = ANother Tool for Language Recognition

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

l  {

n  Sentence ju = new Sentence();               

n  ju.zhu=$WHOSE.text+" age";

n  ju.wei = "is";

n  ju.bin=$INT.text;

n  System.out.println(ju.toString());

l  };

 

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的结构定义dtdxsd),就可以对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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值