一、装配阶段

1、程序入口在ChatterBean.java中的main函数

传入一或两个参数,第一个是properties.xml的路径,第二个参数是"gui"表明是否启动GUI

2、程序一开始

调用
ChatterBean applet = new ChatterBean(args[0]);
进入配置阶段,调用configure方法。然后在configure方法里首先调用beforeConfigure判断当前AliceBot是否为空,如果为空则初始化一个AliceBot。然后
ChatterBeanParser parser = new ChatterBeanParser();
parser.parse(this, path);
进入解析参数阶段,此处的path就是程序一开始传入的properties.xml的路径

3.ChatterBeanParser.parse(ChatterBean bot, String path)

这个方法主要是是从properties文件中获取categories、logs、context、splitters、substitutions的路径并生成InputStream对象
然后调用
bot.setLogger(newLogger(root, logs));
设置log的输出路径
再调用
 botParser.parse(bot.getAliceBot(), context, splitters, substitutions, searcher.search(categories, ".*\\.aiml"));
进入AliceBotParser.parse(AliceBot bot, InputStream defaults, InputStream splitters, InputStream substitutions, InputStream... aiml)
    throws AliceBotParserException方法,解析AIML文件并设置AliceBot的Context和Graphmaster

4. AliceBotParse.newContext(InputStream defaults, InputStream splitters, InputStream substitutions)

解析xml文件,装配并返回context对象。
context.xml,里边记录的一些预设的值
splitters.xml,记录一些标点符号
substitutions,记录一些可以相互替换的值
(1)解析context.xml
调用contParser.parse(context, defaults);进入ContextParse.parse方法
在ContextPare.parse方法中调用parser.parse(input, handler);开始解析xml,此处的handler是被自定义重写了startElement方法
解析xml文件的set和bot节点,并调用Context.property(String name, Object value)方法
首先检查是否已经存在了这样的属性,如果存在就更改,如果不存在就添加,同时如果修改了还会产生一个属性修改的event,比较牛逼
最后,解析出来的这些属性,是存储在Context()对象中Map<String, Object> properties属性中的。
(2)解析spitters.xml和substitutions.xml
解析这两个文件是生成一个Transformations对象,该对象中主要存储的是语句分离器,错误矫正相关信息和一些Substitution

经过以上步骤,完成了context对象的构建

5、AliceBotParse.newGraphmaster(InputStream... aiml)

此方法会再调用AIMLParser.parse(),最终解析所有的AIML文件并把所有的category添加到graphmaster中。

6.AIMLHandler

AIML文件解析的关键就在宇AIMLHandler,这玩意继承了DefaultHandler,可以参考 http://blog.csdn.net/sir_zeng/article/details/17710013
整个解析过程就是在startElement时候根据节点名字生成对应的类,然后push到stack里,
然后在endElement中根据结束节点的名字,判断是否与stack顶的类名相同,如果相同则组合起来生成上一层的对象。以此不断入栈出栈完成了整个XML文件的解析。






Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐