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只做抽象封装,不做实现.依 ...
随机推荐
- 关于session和token
最近做的项目是全平台的,需要给移动端做后台,有了许多改变,如是使用token而不是session.一开始我无法理解为什么不用session,看了很多文章以后才有一定了解. 例如在ios端, ...
- MIUI系统安全中心之自启动管理解密
迄今为止,Android系统的手机已经在整个手机市场中占有很大的比重.其中小米手机更是因为它的性价比和销售模式普遍的出现在了人们的日长生活中. 废话不多说,进入正题.作为一个Android的开发者,避 ...
- java获取文件名的三种方法
import java.io.File; import java.util.Arrays; public class FileName { /** * @param args */ public st ...
- WINCE 获取智能设备唯一编号
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...
- ruby 学习笔记 1
写ruby blog 系统的记录下.也是对我学ruby的点滴记录. 先介绍下我的学习环境.系统:ubuntu12.04文档:techotopia ,ruby文档,the hard way learn ...
- Android中处理OnClick和OnTouch方法冲突的解决方案
目前想到的最好的解决方法,大家有更好的欢迎告知. 问题:在一个view中有一个按钮,要求可以通过点按移动这个按钮,同时单纯的点击而不移动这个按钮的话可以跳转到新的Activity. 遇到的困难:按钮的 ...
- Linq学习工具及Lamada表达式
好东西.转载一个.以备学习 Linq学习工具: http://www.linqpad.net/ Lamada表达式: Func<int, int, int> IntPow = (x ...
- <Operating System>进程调度
在多道程序环境下,进程数目往往多于处理机数目,致使它们争用处理机.这就要求系统能按某种算法,动态地把处理机分配给就绪队列中的一个进程,使之执行.分配处理机的任务是由进程调度程序完成的. 三级调度 一个 ...
- 【转】react 状态与属性区别
prop state 能否从父组件获取初始值 是 否 能否由父组件修改 ...
- bdb mvcc: buffer 何时可以被 看到; mvcc trans何时被移除
# txn.h struct __db_txnregion SH_TAILQ_HEAD(__active) active_txn; SH_TAILQ_HEAD(__mvcc) mvcc_txn; # ...