Atiit 如何手写词法解析器

1.1. 通过编程直接从正则->nfa->dfa->表驱动词法解析一条龙自动生成。那是用程序自动生成是需要这样的,自己手写完全不必要这么复杂1

1.2. 状态转移表。使用状态表比较简单,dfa比较麻烦。Dfa其实就是比较高级的状态表。。1

1.3. 然后给了你代码框架(这里以nested case statement 为例):2

1.4. 源码实现2

1.1. 通过编程直接从正则->nfa->dfa->表驱动词法解析一条龙自动生成。那是用程序自动生成是需要这样的,自己手写完全不必要这么复杂

尤其是scanner 的时候一上来就看各种自动机。
直接回答你的疑问就是:在实际中手写词法分析器时,你所说的“RE -> NFA -> DFA -> Scanning Table” 一个都不会出现。原因有二:

书上说的这么复杂的一系列计算都是为了做scanner generator(比如flex)。自动生成的scanner 一般有两部分,一部分是固定的一段代码,相当于一个interpreter,它读入scanning table 和源程序,生成一系列的token;另一部分就是scanning table,它直接对应你给的词法规则,而要通过“程序”生成这个table 就需要你说的那一长串计算。然而你手写scanner 的时候根本不用考虑这些

 自己写解析器,正则什么的都不需要了解的。。

第一步::做个状态转换表,就是当前状态什么,当前字符是什么,下一状态是什么就可以了。

1.2. 状态转移表。使用状态表比较简单,dfa比较麻烦。Dfa其实就是比较高级的状态表。。

cur_dbquo_stat

当前状态

当前字符

要即将转换到的下一状态

\

“  dbQuo_start

<none>

Not sQuo start

Not dbQuo_start

sQuo  start

sQuo start

sQuo  end

Dbquo end or <non>

Not Dbquo start

Dbquo start

Dbquo start

Dbquo end

Non sQuo  dbquo start

,

1.3. 然后给了你代码框架(这里以nested case statement 为例):

然后告诉你最外层case覆盖特定字符,内层每个case覆盖这个状态的所有转换。特别清晰简单有木有!!!编程时候直接填空就行了!

1.4. 源码实现

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 BrkStartEvt() {

char c = this.cur_char;

if (c == '(' && !this.curStat.equals("strStart")) { // && cur stta=ini

List<Token> li = Lists.newArrayList();

Token tk = new Token(this.curTokenTxt).setType("var");

li.add(tk);

Token tk2 = new Token("(").setType("op");

li.add(tk2);

this.curTokenTxt = "";

this.curStat = "brkStart";

return li;

}

throw new RuntimeException("BrkStartEvt");

}

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

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

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

Atiend

Atiit 如何手写词法解析器的更多相关文章

  1. 手写Json解析器学习心得

    一. 介绍 一周前,老同学阿立给我转了一篇知乎回答,答主说检验一门语言是否掌握的标准是实现一个Json解析器,网易游戏过去的Python入门培训作业之一就是五天时间实现一个Json解析器. 知乎回答- ...

  2. 手写token解析器、语法解析器、LLVM IR生成器(GO语言)

    最近开始尝试用go写点东西,正好在看LLVM的资料,就写了点相关的内容 - 前端解析器+中间代码生成(本地代码的汇编.执行则靠LLVM工具链完成) https://github.com/daibinh ...

  3. 面试题|手写JSON解析器

    这周的 Cassidoo 的每周简讯有这么一个面试题:: 写一个函数,这个函数接收一个正确的 JSON 字符串并将其转化为一个对象(或字典,映射等,这取决于你选择的语言).示例输入: fakePars ...

  4. boost之词法解析器spirit

    摘要:解析器就是编译原理中的语言的词法分析器,可以按照文法规则提取字符或者单词.功能:接受扫描器的输入,并根据语法规则对输入流进行匹配,匹配成功后执行语义动作,进行输入数据的处理. C++ 程序员需要 ...

  5. 手写一个类加载器demo

    1.什么是类加载器? 2.加载方式 ClassLoader类加载器,主要的作用是将class文件加载到jvm虚拟机中.jvm启动的时候,并不是一次性加载所有的类,而是根据需要动态去加载类,主要分为隐式 ...

  6. js手写图片查看器(图片的缩放、旋转、拖拽)

    在做一次代码编辑任务中,要查看图片器.在时间允许的条件下,放弃了已经封装好的图片jq插件,现在自己手写js实现图片的缩放.旋转.推拽功能! 具体代码如下: <!DOCTYPE html> ...

  7. 前端面试题整理——手写方法解析URL参数

    //拆分字符串形式 function queryToObj() { const res = {} const search = location.search.substr(1);//去掉前面的&qu ...

  8. 自制操作系统Antz(14)——实现内置编程语言(词法解析器)

    AntzScript

  9. 手写事务管理器 也是spring实现事务管理的原理

随机推荐

  1. 页面点击任意js事件,触发360、IE浏览器新页面

    在<head></head>标签中 <base target=_self> 不会再增加页面

  2. vs调试断点进不去的解决办法

    原创文章,禁止转载. 断点进不去的解决办法:  确认是debug版本  确认生成了调试信息  确认在编译和连接的工程配置中指定了相同的匹配的pdb文件名,而不是默认的vc100.pdb等名字(无关) ...

  3. Springmvc中@RequestParam传值中文乱码解决方案

    首先jsp表单里面有一些参数要传到controller中,通过以下方法接收: @RequestMapping(value="/orderPaper") public ModelAn ...

  4. C#内存释放

    看微软件的宣传说NET会自动回收内存.以前一直以为NET会自动回收也没有去细看. 近来发现NET下的winForm程序,默认情况下不会自动释放内存.如果是循执行的程序内存会不断增大.具体会大到多少没有 ...

  5. java 线程安全不线程不安全

    经常看到一些类,有的说线程安全,有的说线程不安全,顿时懵逼. 线程安全不安全,主要是在多线程执行的情况下,如果由于线程之间抢占资源而造成程序的bug即为线程不安全,下面就拿arraylist 和Vec ...

  6. Java学习笔记五——流程控制

    分支结构 Java提供了两种常见的分支控制结构:if语句和switch语句. if语句 if语句使用布尔值或布尔表达式(表达式结果为布尔值),if语句有3中形式: 第一种形式: if (5 > ...

  7. js继承理解(有引用)

    具体栗子:http://www.cnblogs.com/ayqy/p/4471638.html(地下为自己理解总结,可能晦涩,链接详细) 1.父类实例赋予子类原型. 2.利用子类函数引用 父类.cal ...

  8. 【设计模式之装饰者模式InJava】

    需求:定义一个操作系统OS接口,安装Windows10操作系统,在上面安装虚拟机VMWare,虚拟机里装Linux; 然后在Linux中安装虚拟机VMware,再在虚拟机里安装MacOS操作系统. 实 ...

  9. Online Judge中基本的输入输出

    一.利用c语言处理输入和输出 1.输入: 在C语言中输入中stdin指针表示标准的输入,scanf默认读取的就是stdin指向的输入,在acm中我们可能需要不断的测试,最好将stdin重定向到某一个文 ...

  10. java servlet之过滤器1(解决jsp之间POST方式数据传递乱码)

    首先,看看没有解决乱码的效果,新建两个jsp页面(a.jsp跳转到b.jsp). <form action="b.jsp" method="post"&g ...