Atitit 词法分析器的设计最佳实践说明attilax总结

1.1. 手写的优点:代码可读,对源代码中的各种错误给出友好的提示信息,用户体验高,1

1.2. 使用状态表比较简单,dfa比较麻烦1

1.3. 优先递归 替换循环1

1.4. 内部分支switch替换if else1

1.5. 单独的db que状态,内部可以容易包含single quo1

1.6. 范例1

1.1. 手写的优点:代码可读,对源代码中的各种错误给出友好的提示信息,用户体验高, 

产品级别的编译器需要对源代码中的各种错误给出友好的提示信息。而DFA在这方面无法满足需要

1.2. 使用状态表比较简单,dfa比较麻烦

1.3. 优先递归 替换循环

递归可读性更好。。

1.4. 内部分支switch替换if else..nest case大法

1.5. 单独的db que状态,内部可以容易包含single quo

1.6. 范例

/AtiPlatf_ee/src/com/attilax/fsm/JavaTokenScannerV2.java

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));

}

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();

}

rivate 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();

}

作者:: 绰号:老哇的爪子 ( 全名::Attilax Akbar Al Rapanui 阿提拉克斯 阿克巴 阿尔 拉帕努伊 )

汉字名:艾提拉(艾龙),   EMAIL:1466519819@qq.com

转载请注明来源: http://www.cnblogs.com/attilax/

Atiend

Atitit 词法分析器的设计最佳实践说明attilax总结的更多相关文章

  1. Atitit. 软件设计 模式 变量 方法 命名最佳实践 vp820 attilax总结命名表大全

    Atitit. 软件设计 模式 变量 方法 命名最佳实践 vp820 attilax总结命名表大全 1. #====提升抽象层次1 2. #----使用通用单词1 3. #===使用术语..1 4.  ...

  2. atitit.基于http json api 接口设计 最佳实践 总结o7

    atitit.基于http  json  api 接口设计 最佳实践 总结o7 1. 需求:::服务器and android 端接口通讯 2 2. 接口开发的要点 2 2.1. 普通参数 meth,p ...

  3. Atitit.angular.js 使用最佳实践 原理与常见问题解决与列表显示案例 attilax总结

    Atitit.angular.js 使用最佳实践 原理与常见问题解决与列表显示案例 attilax总结 1. 本文范围 1 2. Angular的优点 1 2.1. 双向数据绑定 1 2.2. dsl ...

  4. atitit.导航的实现最佳实践and声明式编程

    atitit.导航的实现最佳实践and声明式编程 1. 顶部水平栏导航 1 2. 竖直/侧边栏导航 1 3. 选项卡导航 1 4. 面包屑导航 1 5. 标签导航 1 6. 搜索导航 2 7. 分面/ ...

  5. RESTful API 设计最佳实践

    背景 目前互联网上充斥着大量的关于RESTful API(为了方便,以后API和RESTful API 一个意思)如何设计的文章,然而却没有一个"万能"的设计标准:如何鉴权?API ...

  6. ****RESTful API 设计最佳实践(APP后端API设计参考典范)

    http://blog.jobbole.com/41233/ 背景 目前互联网上充斥着大量的关于RESTful API(为方便,下文中“RESTful API ”简写为“API”)如何设计的文章,然而 ...

  7. RESTful API 设计最佳实践(转)

    摘要:目前互联网上充斥着大量的关于RESTful API(为了方便,以后API和RESTful API 一个意思)如何设计的文章,然而却没有一个”万能“的设计标准:如何鉴权?API格式如何?你的API ...

  8. RESTful API 设计最佳实践(转)

    背景 目前互联网上充斥着大量的关于RESTful API(为方便,下文中“RESTful API ”简写为“API”)如何设计的文章,然而却没有一个”万能“的设计标准:如何鉴权?API 格式如何?你的 ...

  9. RESTful API 设计指南,RESTful API 设计最佳实践

    RESTful API 设计指南,RESTful API 设计最佳实践 网络应用程序,分为前端和后端两个部分.当前的发展趋势,就是前端设备层出不穷(手机.平板.桌面电脑.其他专用设备......). ...

随机推荐

  1. 通俗易懂的 JSon解析处理

    1.主要用到的类: 主要用到了JavaScriptSerializer类,该类在System.Web.Script.Serialization命名空间(在System.Web.Extensions.d ...

  2. angular js 的 ng-keyup 监听 keydown keyup事件获取 keyCode

    参考这个页面.http://www.angularjshub.com/examples/eventhandlers/keyboardevents/ Html页面代码: <input ng-mod ...

  3. 数学工具WZgrapher

    之前说了mathGV,其实还有一个不错类似软件WZgrapher,不仅可以画函数图,还可以微积分. 截图如下:

  4. Java:switch语句例子

    1.输入一个名次,第1-4名,分别称为冠军.亚军.季军.殿军,5名及5名以上,称为其他名次. import java.util.Scanner; public class switch1 { publ ...

  5. 【dubbo】消费者Consumer搭建

    一.consumer搭建(可以web/jar) 1.新建Maven项目,groupId:com.dubbo.consumer.demo artifactId:demo projectName:dubb ...

  6. centos 安装 apache2.4

    1. centos 安装 apache2.4 安装基础依赖:# yum install gcc gcc-c++ glibc glibc-devel gd gd-devel zlib zlib-deve ...

  7. eclipse左边导航package explorer自动定位

    eclipse或myeclipse中右边编辑界面点击 左边导航自动定位     左导航Package Explorer的右上角有一个黄色双向箭头图标,鼠标移动到上面提示"Link with ...

  8. 对文本行进行排序,新增-d(目录排序),只对字母数字空格排序(TCPL 练习5-16)

    文本行的排序用到了命令行参数以及多级指针,在要求只对字母数字空格进行排序时,关键的问题点是兼容-f命令参数,也就是排序的同时忽略大小写.由于在之前的练习中,我将忽略大小写的比较方法重新写了一个函数tr ...

  9. 骨骼动画的实现(OpenGL实现)

    人物模型动画一直是游戏中最重要的组成部分, 因此这里我们研究骨骼动画是如何实现的. 原理 首先模型通常是由多个三角形形成的网格构成, 每个三角形有三个顶点, 因此动画的根本原理就在于不同时间内为每个顶 ...

  10. .NET Framework 基础知识总结

    C#: 1. public:同一个程序集的任何代码或引用该程序集的其他程序集都可以访问该类型或成员 internal:同一个程序集的任何代码都可以访问该类型或成员 private :只有在结构或类中的 ...