Atitit 词法分析器的设计最佳实践说明attilax总结
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://blog.csdn.net/attilax
Atiend
Atitit 词法分析器的设计最佳实践说明attilax总结相关推荐
- RESTful API 设计最佳实践
2019独角兽企业重金招聘Python工程师标准>>> 背景 目前互联网上充斥着大量的关于RESTful API(为方便,下文中"RESTful API "简写为 ...
- mongodb数据合并设计_「时间序列数据」和MongoDB(二)-模式设计最佳实践
在上一篇博客文章时间序列数据与MongoDB:第一部分-简介中,我们介绍了时间序列数据的概念,然后介绍了一些可以用于帮助收集时间序列应用程序需求的发现问题.对这些问题的回答有助于指导支持大容量生产应用 ...
- python组件的react实现_React-Router动态路由设计最佳实践
写在前面 随着单页应用(SPA)概念的日趋火热,React框架在设计和实践中同样也围绕着SPA的概念来打造自己的技术栈体系,其中路由模块便是非常重要的一个组成部分.它承载着应用功能分区,复杂模块组织, ...
- 软件架构设计最佳实践
软件架构设计最佳实践 课程介绍: 1.深入阐述软件架构设计的思想.方向及趋势:2.剖析软件架构的全景视图:3.结合实际案例分析架构设计过程及需求对架构的影响:4.如何实用设计模式来实现好的架构:5.实 ...
- 来自Google资深工程师的API设计最佳实践
来自Google资深工程师Joshua Bloch的分享:API设计最佳实践 为什么API设计如此重要?API是一个公司最重要的资产. 为什么API的设计对程序员如此重要? API一旦发布,出于兼容性 ...
- [译] RESTful API 设计最佳实践
https://juejin.im/entry/6844903503953920007 [译] RESTful API 设计最佳实践 阅读 8779 收藏 0 2017-10-16 原文链接: seg ...
- 设计模式 工厂方法_使用工厂方法模式设计最佳实践
设计模式 工厂方法 在前面的"设计模式"示例中,我们解释了当今常用的"工厂"模式. 在本节中,我们将了解具有更多抽象的更高级的解决方案. 该模式称为工厂方法设计 ...
- 使用工厂方法模式设计最佳实践
在前面的"设计模式"示例中,我们解释了当今常用的"工厂"模式. 在本节中,我们将了解具有更多抽象的更高级的解决方案. 该模式称为工厂方法设计模式. 定义: Fa ...
- 20个数据库设计最佳实践
2019独角兽企业重金招聘Python工程师标准>>> 数据库设计是整个程序的重点之一,为了支持相关程序运行,最佳的数据库设计往往不可能一蹴而就,只能反复探寻并逐步求精,这是一个复杂 ...
- 软件架构设计最佳实践(课程大纲)
软件架构设计最佳实践 课程介绍: 1.深入阐述软件架构设计的思想.方向及趋势: 2.剖析软件架构的全景视图: 3.结合实际案例分析架构设计过程及需求对架构的影响: 4.如何实用设计模式来实现好的架构: ...
最新文章
- 如何打开写好的jpetstore
- 如何有效地记录 Java SQL 日志(转)
- jvm性能调优实战 -55RPC调用引发的OOM故障
- 浅谈多进程多线程的选择(转)
- Layui中Jquery动态设置的select标签加载时而正常时而失效问题排查和解决
- OpenTTD 1.9.0-beta3 发布,开源模拟经营游戏
- ViewController类中得方法和属性的用途
- Linux中的cron计划任务配置详解
- CVPR 2021 Oral | Transformer!UP-DETR:无监督预训练检测器
- java火箭应用_从火箭发场景来学习Java多线程并发闭锁对象
- Sticky Footer 粘性底部-让底部一直在页面最下面
- android预览界面显示不全,Android SurfaceView Camera 预览显示不全(画面拉伸)
- hdu 5055 Bob and math problem
- 前端直接读取文本文件内容
- mysql从库新增_MySQL新增从库
- NYOJ 37 动态规划 回文字符串
- 用C语言实现猜数游戏
- 【Word】如何实现特殊数字 带圈数字
- 阿里云物联网平台如何进行云产品流转
- 最多站长使用的DNS服务商