Atitit 发帖机系列(8) 词法分析器v5 版本新特性说明)
Atitit 发帖机系列(8) 词法分析器v5 版本新特性说明)
v5 增加对sql单引号的内部支持。可以作为string
结构调整,使用递归法重构循环发。。放弃循环发。
V4 java dsl词法分析 使用循环
V3 sql的词法分析
atitit..sql update语法的词法分析,与语法ast构建 -
V1版 anno 解析器 基于fsm设计模式
V2
Atitit.antlr实现词法分析 - attilax
/AtiPlatf_ee/src/com/attilax/fsm/JavaTokenScannerV2.java
package com.attilax.fsm;
import java.util.Collection;
import java.util.List;
import com.attilax.io.filex;
import com.attilax.io.pathx;
import com.attilax.json.AtiJson;
import com.google.common.collect.Lists;
public class JavaTokenScannerV2 {
public static void main(String[] args) {
String f = pathx.prjPath_webrootMode() + "/tokenT/a.txt";
String s = "meth(\\\"select from table where a='bb' \",'str2',\'s3\') ";
s = "meth(\"select from tab where a='abc'\",'str2','s3')";
// s = filex.read(f);
List<Token> li = new JavaTokenScannerV2().getTokens(s);
System.out.println(AtiJson.toJson(li));
}
List<Token> tokens = Lists.newArrayList();
String curTokenTxt = "";
String splitors = "(),";
String curStat = "ini";
String curDbquoStat = "ini";
private String code;
public char[] code_char_arr;
public char cur_char;
int gColumn = -1;
@SuppressWarnings("unchecked")
public List<Token> getTokens(String codeStr) {
List<Token> li = Lists.newArrayList();
code_char_arr = codeStr.toCharArray();
while (true) {
Object tk;
try {
tk = nextTokens();
} catch (TokenEndEx e) {
break;
}
if (tk instanceof Token)
li.add((Token) tk);
else if (tk instanceof List)
li.addAll((Collection<? extends Token>) tk);
else
throw new RuntimeException("token type err,curchar:" + this.cur_char + ",colidx:" + this.gColumn);
}
return li;
}
public Object nextTokens() throws TokenEndEx {
// code_char_arr = code.toCharArray();
gColumn++;
if (gColumn > code_char_arr.length - 1)
throw new TokenEndEx(new String(code_char_arr));
cur_char = code_char_arr[gColumn];
// cur_char=cur_char;
if (this.curTokenTxt.equals("1598"))
System.out.println("dbg");
if (this.gColumn == 30)
System.out.println("dbg");
// get next char,,then change stat
// jude cur char and cur stat...then if or not chage stat
switch (cur_char) {
case '(':
return BrkStartEvt();
// break;
case ')':
return brkEndEvt();
case '\'':
return sQuoEvt();
case '\"':
return dbQuoEvt();
case ':':
return colonEvt();
case ',':
return commaEvt();
default:
return normalCharEvt();
// break;
}
}
private Object normalCharEvt() throws TokenEndEx {
// normal char
curTokenTxt = curTokenTxt + String.valueOf(cur_char);
// gColumn += 1;
return nextTokens();
}
private Object commaEvt() throws TokenEndEx {
List<Token> tokens = Lists.newArrayList();
if (cur_char == ',' && !this.curStat.equals("squoStart") && !this.curStat.equals("dbquoStart")) {
if (this.curTokenTxt.trim().length() > 0) {
String curTokenTye = "con";
if (this.curTokenTxt.startsWith(":"))
curTokenTye = "op";
else if (this.curStat.equals("colon"))
curTokenTye = "op";
Token tk4 = new Token(this.curTokenTxt).setType(curTokenTye);
tokens.add(tk4);
return tokens;
}
Token tk3 = new Token(String.valueOf(cur_char)).setType("spltr");
tokens.add(tk3);
this.curTokenTxt = "";
this.curStat = "commaStat";
return tk3;
}
return normalCharEvt();
}
private Object colonEvt() {
List<Token> tokens = Lists.newArrayList();
if (cur_char == ':' && !this.curStat.equals("strStart")) {
if (this.curTokenTxt.trim().length() > 0) {
String curTokenTye = "con";
Token tk4 = new Token(this.curTokenTxt).setType(curTokenTye);
tokens.add(tk4);
}
Token tk3 = new Token(String.valueOf(cur_char)).setType("op");
tokens.add(tk3);
this.curTokenTxt = "";
this.curStat = "colon";
return tokens;
}
return tokens;
}
private Object dbQuoEvt() throws TokenEndEx {
// ---------------str type
// first dbquo
if ((cur_char == '\"') && (this.curDbquoStat != "dbquoStart")) //
{
this.curStat = "dbquoStart";
this.curDbquoStat = "dbquoStart";
this.curTokenTxt = "";
return nextTokens();
}
// for close dbquo
if ((cur_char == '\"') && this.curDbquoStat.equals("dbquoStart")) {
Token tk3 = new Token(this.curTokenTxt).setType("str");
tokens.add(tk3);
this.curTokenTxt = "";
this.curStat = "dbquoEnd";
this.curDbquoStat = "dbquoEnd";
return tk3;
}
return normalCharEvt();
}
private Object sQuoEvt() throws TokenEndEx {
char c = this.cur_char;
// for in dbquo ..single quo ..none process as normal char
// first single quoe
if (c == '\'' && (this.curStat != "dbquoStart") && this.curStat != "squoStart") //
{
this.curStat = "squoStart";
this.curTokenTxt = "";
return nextTokens();
}
// for close single quoue
if ((c == '\'') && this.curStat.equals("squoStart")) {
Token tk3 = new Token(this.curTokenTxt).setType("str");
tokens.add(tk3);
this.curTokenTxt = "";
this.curStat = "squoEnd";
return tk3;
}
return normalCharEvt();
}
private Object brkEndEvt() {
char c = this.cur_char;
if (c == ')' && !this.curStat.equals("strStart")) { // && cur stat
// =brk start
if (this.curTokenTxt.length() > 0) // jeig cant smp... last end brk
// is impt..if smp continue
// ,then cant add end brk to
// token
{
String type = gettype_4curCharIsBrkend(this.curTokenTxt, this.curStat);
Token tk3 = new Token(this.curTokenTxt).setType(type);
tokens.add(tk3);
}
Token tk2 = new Token(")").setType("op");
tokens.add(tk2);
this.curTokenTxt = "";
this.curStat = "brkEnd";
return tk2;
}
return c;
}
}
作者:: 绰号:老哇的爪子 ( 全名::Attilax Akbar Al Rapanui 阿提拉克斯 阿克巴 阿尔 拉帕努伊 )
汉字名:艾提拉(艾龙), EMAIL:1466519819@qq.com
转载请注明来源: http://www.cnblogs.com/attilax/
--Atiend
Atitit 发帖机系列(8) 词法分析器v5 版本新特性说明)的更多相关文章
- Atitit 发帖机系列(7) 词法分析的方法attilax大总结)
Atitit 发帖机系列(7) 词法分析的方法attilax大总结) 1.1. 词法分析貌似俩大方法,一个直接根据状态图转换,一个根据dfa1 1.2. switchcase或者ifelse 最原始方 ...
- Atitit 发帖机系列(6) USRQBN2201 setup spec安装程序的实现规范与标准化解决方案
Atitit 发帖机系列(6) USRQBN2201 setup spec安装程序的实现规范与标准化解决方案 安装主要解决一个问题,就是resin的内容启动路径以及端口..这里是使用的端口8077 主 ...
- Atitit 发帖机实现(4 )- usbQBM1601 gui操作标准化规范与解决方案attilax总结
Atitit 发帖机实现(4 )- usbQBM1601 gui操作标准化规范与解决方案attilax总结 1.1. 根据gui的类型使用不同的gui调用api1 1.2. Script化1 1.3. ...
- Atitit 发帖机实现(3 )---usrQBN023 js提交ajax内容到后端规范与标准化
Atitit 发帖机实现(3 )---usrQBN023 js提交ajax内容到后端规范与标准化 大段内容务必要替换转义换行符号1 提交务必使用utf编码,否则解码后的可能缺失,是web serv ...
- Atitit 发帖机实现(2)---usrQBN2243 文本解析到对象协议规范
Atitit 发帖机实现(2)---usrQBN2243 文本解析到对象协议规范 文本内容 ###注释 标题:标题标题标题标题标题1 人数:5 月薪:2000-3000 内容: 内容内容内 容内容内容 ...
- Atitit 发帖机实现(1)-----UsrQBm2008 页面上下文规范
Atitit 发帖机实现(1)-----UsrQBm2008 页面上下文规范 1.1. 网站绝对路径,页面绝对路径1 1.2. Java的javax.servlet.ServletContext1 ...
- Atitit opencv版本新特性attilax总结
Atitit opencv版本新特性attilax总结 1.1. :OpenCV 3.0 发布,史上功能最全,速度最快的版1 1.2. 应用领域2 1.3. OPENCV2.4.3改进 2.4.2就有 ...
- Atitit mac os 版本 新特性 attilax大总结
Atitit mac os 版本 新特性 attilax大总结 1. Macos概述1 2. 早期2 2.1. Macintosh OS (系统 1.0) 1984年2 2.2. Mac OS 7. ...
- 【开源】OSharp3.3框架解说系列:重新开源及3.3版本新特性
OSharp是什么? OSharp是个快速开发框架,但不是一个大而全的包罗万象的框架,严格的说,OSharp中什么都没有实现.与其他大而全的框架最大的不同点,就是OSharp只做抽象封装,不做实现.依 ...
随机推荐
- Coursera Robotics系列课心得
Robotics Perception Professor Kostas and Jianbo Shi week 1: camera model 凸透镜成像原理:凸透镜焦点与焦距是固定的,这是物理性质 ...
- 关于Scrum团队的理解
<阅读完<构建之法>第6~7章>之读后感 阅读完<构建之法>第6~7章之后,不仅感觉获益匪浅,也甚感团队合作.分配.工作的不易与一个团队运营一个项目并推广的艰辛与 ...
- 什么是SQL注入
一种简单的web应用架构,: 表示层(web浏览器或呈现引擎)———>逻辑层(如C#,ASP,.NET,PHP,JSP等编程语言)———>存储层(如Microsoft SQL Server ...
- JBoss CLI
转自http://www.cnblogs.com/inteliot/archive/2012/08/05/2623719.html 为 了便于维护和管理, JBoss AS 7 提供了命令行接口( ...
- solr&lucene3.6.0源码解析(三)
solr索引操作(包括新增 更新 删除 提交 合并等)相关UML图如下 从上面的类图我们可以发现,其中体现了工厂方法模式及责任链模式的运用 UpdateRequestProcessor相当于责任链模式 ...
- Spring 使用JSTL标签显示后台数据
1. 先上项目结构图,其中config包下的代码文件参见前一篇博客 http://www.cnblogs.com/njust-ycc/p/6123505.html 引包: 2. 主要代码 (1)U ...
- 创建寄宿在Windows服务中的WCF服务
1.创建Windows服务项目 2.Server1改名为你想要的名称,比如WinServer 3.在项目中新建一个WCF文件夹,用于存放wcf服务文件. 注:在WcfServer类的上面还要添加 [S ...
- MySQL中VARCHAR与CHAR格式数据的区别
区别 CHAR与VARCHAR类型类似,但它们保存和检索的方式不同.CHAR有固定的长度,而VARCHAR属于可变长的字符类型.它们最大长度和是否尾部空格被保留等方面也不同.在存储和检索过程中不进行大 ...
- Programming Entity Framework CodeFirst--表关系约定
表之间的关系分为一对多,多对多,一对一三种,实质就是对外键进行配置. 一.一对多 1. Required Destination包含Lodging>的集合. public class Desti ...
- Windbg用法详解
工作空间 WinDBG的工作空间中保存了以下几种信息 调试会话状态: 包括断点,打开的源文件,用户定义的别名(alias)等. 调试器设置:包括符号文件路径,可执行映像文件路径,源文件路径,用I+/I ...