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 版本新特性说明)的更多相关文章

  1. Atitit 发帖机系列(7) 词法分析的方法attilax大总结)

    Atitit 发帖机系列(7) 词法分析的方法attilax大总结) 1.1. 词法分析貌似俩大方法,一个直接根据状态图转换,一个根据dfa1 1.2. switchcase或者ifelse 最原始方 ...

  2. Atitit 发帖机系列(6) USRQBN2201 setup spec安装程序的实现规范与标准化解决方案

    Atitit 发帖机系列(6) USRQBN2201 setup spec安装程序的实现规范与标准化解决方案 安装主要解决一个问题,就是resin的内容启动路径以及端口..这里是使用的端口8077 主 ...

  3. Atitit 发帖机实现(4 )- usbQBM1601 gui操作标准化规范与解决方案attilax总结

    Atitit 发帖机实现(4 )- usbQBM1601 gui操作标准化规范与解决方案attilax总结 1.1. 根据gui的类型使用不同的gui调用api1 1.2. Script化1 1.3. ...

  4. Atitit   发帖机实现(3 )---usrQBN023 js提交ajax内容到后端规范与标准化

    Atitit   发帖机实现(3 )---usrQBN023 js提交ajax内容到后端规范与标准化 大段内容务必要替换转义换行符号1 提交务必使用utf编码,否则解码后的可能缺失,是web serv ...

  5. Atitit 发帖机实现(2)---usrQBN2243 文本解析到对象协议规范

    Atitit 发帖机实现(2)---usrQBN2243 文本解析到对象协议规范 文本内容 ###注释 标题:标题标题标题标题标题1 人数:5 月薪:2000-3000 内容: 内容内容内 容内容内容 ...

  6. Atitit  发帖机实现(1)-----UsrQBm2008 页面上下文规范

    Atitit  发帖机实现(1)-----UsrQBm2008 页面上下文规范 1.1. 网站绝对路径,页面绝对路径1 1.2. Java的javax.servlet.ServletContext1 ...

  7. Atitit opencv版本新特性attilax总结

    Atitit opencv版本新特性attilax总结 1.1. :OpenCV 3.0 发布,史上功能最全,速度最快的版1 1.2. 应用领域2 1.3. OPENCV2.4.3改进 2.4.2就有 ...

  8. 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. ...

  9. 【开源】OSharp3.3框架解说系列:重新开源及3.3版本新特性

    OSharp是什么? OSharp是个快速开发框架,但不是一个大而全的包罗万象的框架,严格的说,OSharp中什么都没有实现.与其他大而全的框架最大的不同点,就是OSharp只做抽象封装,不做实现.依 ...

随机推荐

  1. The Template method pattern

    public class TemplateMethodDemo { public static void main(String[] args) { Teacher test=new Javatrea ...

  2. Genymotion创建下载模拟器的时候出现Unable to create Genymotion virtual devices:Connection timeout错误

    如图,如果Genymotion创建下载模拟器的时候出现Unable to create Genymotion virtual devices:Connection timeout错误,具体解决方法如下 ...

  3. Head First 设计模式读书笔记

    在网上学习了一段时间设计模式,总感觉不系统,很容易忘,最近买书,学习了<Head First设计模式>,受益匪浅,特做此记录,以便激励自己不断的向后学习. 原书JAVA版本,本次学习记录及 ...

  4. 什么是SQL注入

    一种简单的web应用架构,: 表示层(web浏览器或呈现引擎)———>逻辑层(如C#,ASP,.NET,PHP,JSP等编程语言)———>存储层(如Microsoft SQL Server ...

  5. 《python核心编程》笔记——杂项

    python语句默认会给每一行添加一个换行符,只要在最后加一个逗号就能改变这种行为 若函数里没有return就自动返回None对象 PEP(python增强提案简称)http://python.org ...

  6. 文本框如果不输入任何内容提交过后是一个空字符串还是null

    1.在表单不填就提交的情况下,text类型和textarea类型的表单域,提交到服务端为空 2.checkbox.readio.select等表单域在为不填情况下不会提交到服务器,也就是说服务器接收不 ...

  7. Ubuntu 安装mysql和简单操作

    http://www.cnblogs.com/zhuyp1015/p/3561470.html ubuntu上安装mysql非常简单只需要几条命令就可以完成. 1. sudo apt-get inst ...

  8. [原] XAF 添加日期筛选下拉选择

    1.ListView 添加日期筛选下拉选择,选择指定,可指定日期范围 2.Code using DevExpress.Data.Filtering; using DevExpress.ExpressA ...

  9. C2第八次解题报告

    看过题解后如果觉得还算有用,请帮忙加点我所在团队博客访问量 http://www.cnblogs.com/newbe/ http://www.cnblogs.com/newbe/p/4069834.h ...

  10. 深入分析PHP优化及注意事项

    深入分析PHP优化及注意事项 1.尽量静态化: 如果一个方法能被静态,那就声明它为静态的,速度可提高1/4,甚至我测试的时候,这个提高了近三倍. 当然了,这个测试方法需要在十万级以上次执行,效果才明显 ...