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. Ubuntu上安装Minecraft服务器

    Minecraft由于其独特的魅力吸引了很多玩家.不过游戏的乐趣只有在和朋友一起玩的时候才最有意思,所以很早以前我就想建设自己的服务器.但由于专业知识欠缺,没有实现. 最近接触了Linux服务器,所以 ...

  2. JAVA获取服务器路径的方法

    1.在JSF环境中获取到ServletContext: 1 2 ServletContext sc = (ServletContext)FacesContext.         getCurrent ...

  3. android/ios js 启动apk

    1.在移动设备访问某个连接时时,如果本地安装了其应用客户端,则浏览器会调用本地客户端,没有安装则会跳转到下载页面,提示安装.刚好有这样的需求,网上参考了其他人的实现,大部分都是关于APK和本地js交互 ...

  4. 【转载】Android数据存储之SQLite

    SQLite是D.Richard Hipp用C语言编写的开源嵌入式数据库引擎.它支持大多数的SQL92标准,并且可以在所有主要的操作系统上运行. 在Android中创建的SQLite数据库存储在:/d ...

  5. jquery实现手风琴效果

    html----accordion.html <!DOCTYPE html> <html lang="en"> <head> <meta ...

  6. vs2013的安装以及单元测试

    一.安装过程 1.下载vs2013安装包,打开进行安装.安装过程时间有点长,大概用了一个小时. 2.安装完成.需要登录,可以选择以后再说. 3.选择颜色主题. 4.打开vs2013的界面. 5.添加密 ...

  7. [原] XAF 如何啟用ListView橫向滾動條

    using System; using DevExpress.ExpressApp; using DevExpress.ExpressApp.Win.Editors; using DevExpress ...

  8. centos 6.X minimal 系列最小化安装完成后,安装mono和jexus过程小记录

    在使用虚拟机安装minimal版centos运行mono+jexus的时候,遇到了一些坑,记录一下,比如虚拟机访问不了网络,没wget命令没开放80端口,等等小问题,其他网上教程已经有mono+jex ...

  9. bzoj 3718

    题意:戳这里 思路:很容易发现对于一个车能否移动到最终的位置只要判断路径中得最大高度与自身高端之和是否>w即可. 那么就可以转化为逆序对得最大数问题..即对于每一辆车,判断有那些最初在他前面,而 ...

  10. 用Win7自带的磁盘管理工具给硬盘分区

    最近新买了一台笔记本,要给硬盘分几个区,心想还是用个工具方便点,于是就上网准备下个“硬盘分区魔术师”,但是看到有一篇文章介绍Win7系统也自带了硬盘分区工具,这我以前倒没听说过,试了一下,还挺方便好用 ...