首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

模板发动机-语法解析-有限状态自动机

2012-10-25 
模板引擎-语法解析-有限状态自动机在设计MeteorTL(http://www.meteortl.org)模板引擎时,语法树的解析用到

模板引擎-语法解析-有限状态自动机
在设计MeteorTL(http://www.meteortl.org)模板引擎时,语法树的解析用到了有限状态自动机,这里稍讲一下。
由于将归约算法滞后单独处理(便于测试),这里只实现有限状态自动机,实现序列化分割。
如果后期实现XSLT解析,可能会改为下推自动机实现。

主控程序:



辅助SPI接口及类:

package org.meteortl.core.engine.parser.expression;import java.util.List;import org.meteortl.core.engine.parser.automata.ArrayStateMap;import org.meteortl.core.engine.parser.automata.ListTokenReceiver;import org.meteortl.core.engine.parser.automata.StateAutomata;import org.meteortl.core.engine.parser.automata.StateMap;import org.meteortl.core.engine.parser.automata.StringCharProvider;import org.meteortl.core.engine.parser.automata.TypeResolver;/** *  * 使用状态机实现表达式分割 *  * @author liangfei0201@163.com *  */public class ExpressionTokenizerImpl implements ExpressionTokenizer {// 状态机图private static final int states[][] = {           /* 0.空格, 1.字母, 2.数字, 3.点, 4.引号, 5.反斜杠, 6.括号, 7.其它符号 *//* 0.起始 */{ StateMap.BEGIN, 1, 2, 7, 4, StateMap.ERROR, 6, 7},/* 1.变量 */{ StateMap.BREAK, 1, 1, StateMap.BREAK, StateMap.ERROR, StateMap.ERROR, StateMap.BREAK, StateMap.BREAK},/* 2.数字 */{ StateMap.BREAK, StateMap.ERROR, 2, 3, StateMap.ERROR, StateMap.ERROR, StateMap.BREAK, StateMap.BREAK},/* 3.小数 */{ StateMap.BREAK, StateMap.END, 3, StateMap.BREAK, StateMap.ERROR, StateMap.ERROR, StateMap.BREAK, StateMap.BREAK},/* 4.字符 */{ 4, 4, 4, 4, StateMap.END, 5, 4, 4},/* 5.转义 */{ 4, 4, 4, 4, 4, 4, 4, 4},/* 6.括号 */{ StateMap.BREAK, StateMap.BREAK, StateMap.BREAK, StateMap.BREAK, StateMap.BREAK, StateMap.BREAK, StateMap.BREAK, StateMap.BREAK},/* 7.操作 */{ StateMap.BREAK, StateMap.BREAK, StateMap.BREAK, 7, StateMap.BREAK, StateMap.ERROR, StateMap.BREAK, 7}};private static final StateAutomata stateAutomata = new StateAutomata(new ArrayStateMap(states), new TypeResolver() {public int getType(char ch, String buffer) {if (ch == ' ' || ch == '\t' || ch == '\n' || ch == '\r') return 0;if ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z')) return 1;if (ch >= '0' && ch <= '9') return 2;// if (ch == '.') return 3;if (ch == '"' || ch == '\'') return 4;if (ch == '\\') return 5;if (ch == '(' || ch == ')' || ch == '[' || ch == ']') return 6;return 7;}});public List tokens(String expressionText) {ListTokenReceiver listTokenReceiver = new ListTokenReceiver(); // 接收器stateAutomata.scan(new StringCharProvider(expressionText), listTokenReceiver);return listTokenReceiver.getTokens();}}

热点排行