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://blog.csdn.net/attilax

Atiend

Atiit 如何手写词法解析器相关推荐

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

    哦?从"{"开始,看来是个对象了! 一. 介绍 一周前,老同学阿立给我转了一篇知乎回答,答主说检验一门语言是否掌握的标准是实现一个Json解析器,网易游戏过去的Python入门培训 ...

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

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

  3. Go语言写的解析器(支持json,linq,sql,net,http等)

    Monkey程序语言 Monkey v2.0版本已发布. monkey v2.0 增加了如下内容: 新增 short arrow(->)支持(类似C#的lambda表达式) 增加 列表推导和哈希 ...

  4. PHP的词法解析器:re2c

    http://www.phppan.com/2011/09/php-lexical-re2c/ PHP的词法解析器:re2c 胖胖 PHP 2011/09/26 1 条留言 147 views re2 ...

  5. re2c php,PHP的词法解析器:re2c

    出处:http://www.phppan.com/2011/09/php-lexical-re2c/ 作者: 胖胖 re2c是一个扫描器制作工具,可以创建非常快速灵活的扫描器.它可以产生高效代码,基于 ...

  6. 搜索引擎——反向索引原理揭秘及手写ik分词器

    原创不易,转载请标明地址,或者直接附上我的博客首页https://georgedage.blog.csdn.net/ 上篇博客我们说到,数据库为什么不适合搜索引擎的底层存储?,那么什么适合呢? ela ...

  7. 词法解析器 | 从零实现一门语言

    从这一节开始,进行词法解析器的原理分析和代码实现,我们以C的语法为模板,用C++来进行编译器的代码开发,开发语言任意选择自己熟悉的一种都行. 观察以下代码块,分析其结构. int main(){ in ...

  8. 开源android手写批注,浅析各阅读平台手写批注 智器阅读显身手

    随着电子阅读媒介的流行和阅读成本的降低,电子终端已经成为日常读书看报的工具,用户对阅读速度和功能的要求也随之提高.自古"不动笔墨不读书",电子阅读已经突破仅仅阅读的阶段,凸显&qu ...

  9. 手写数字阅读器用户界面

    目录 介绍 背景 使用代码 解决方案 为什么这么多框架? 解析Mnist数据 实例化和训练神经网络 Mnist培训师 前进通行证 反向传播 Mnist测试用户界面 图像预处理 最后 C#面向对象的神经 ...

  10. python垃圾邮件识别_Python 手写朴素贝叶斯分类器检测垃圾邮件/短信

    自己从头手写一下这些经典的算法,不调用 sklearn 等 API,调一调参数,蛮有收获和启发. 数据集 概要:5572 条短信,13% 的 spam. 选择这个数据集的原因:短信的文本预处理要比 e ...

最新文章

  1. 使用jenkins进行持续集成
  2. ClickHouse系列教程八:从一个服务器导入4T数据到另外一个服务器
  3. 20180517早课记录12-Hadoop
  4. 高并发应用场景下的负载均衡与故障转移实践,AgileEAS.NET SOA 负载均衡介绍与实践...
  5. php 长短字符串转换,将php的数组按照字符串长短进行排序
  6. windows 下怎样利用NET-SNMP 发送和接收trap
  7. java file函数_java File类的使用以及一些函数
  8. redis中的五种基本的数据结构
  9. nutz ajax ie8,版本升级
  10. 一步步编写操作系统 29 cpu缓存简介
  11. Rust 要“进驻” Linux 内核了?Linux 之父:保持观望
  12. 创意油墨飞溅效果的绿树矢量素材
  13. 使用fat jar和proguard对包含第三方依赖包的java代码进行打包混淆
  14. 【测试】15.质量管理体系
  15. 暗黑破坏神不朽怎么在电脑上玩 暗黑破坏神不朽模拟器教程
  16. Ceph分布式存储的搭建(增加mon节点、模拟osd节点故障恢复)
  17. grafana-reporter安装及配置
  18. java实现通讯录部分截图
  19. Android灯光系统(电池灯/通知灯)
  20. TeKtronix TDS210数字示波器说明书

热门文章

  1. java中多态含有math类_Java面试题汇总《Java基础、语法51-55》
  2. if mysql sum 视图_MySQL(Excel透视)
  3. 大规模均衡分割与层次聚类
  4. Mysql:如何使用limit
  5. Java Thread 多线程 操作线程
  6. Python 日期时间处理
  7. 演练Ext JS 4.2自定义主题
  8. linux mattrib 命令详解
  9. CF1151div2(Round 553)
  10. 学习Java随记之swing编程(2)