atitit.词法分析的实现token attilax总结
atitit.词法分析的实现token attilax总结
1. 词法分析(英语:lexical analysis)跟token 1
2. 单词流必须识别为保留字,标识符(变量),常量,操作符(运算符 )和界符五大类 2
2.2. 4.界符:“;”分号,“{}”大括号,单引号,双引号
3
1. 词法分析(英语:lexical analysis)跟token
是计算机科学中将字符序列转换为单词(Token)序列的过程。进行词法分析的程序或者函数叫作词法分析器(Lexical analyzer,简称Lexer),也叫扫描器(Scanner)。词法分析器一般以函数的形式存在,供语法分析器调用。
这里的单词是一个字符串,是构成源代码的最小单位。从输入字符流中生成单词的过程叫作单词化(Tokenization),在这个过程中,词法分析器还会对单词进行分类。
词法分析器通常不会关心单词之间的关系(属于语法分析的范畴),举例来说:词法分析器能够将括号识别为单词,但并不保证括号是否匹配。
词法分析(lexical analysis)或扫描(scanning)是编译器的第一个步骤。词法分析器读入组成源程序的字符流,并且将它们组织成有意义的词素(lexeme)的序列,并对每个词素产生词法单元(token)作为输出。
简单的来说,词法分析就是将源程序(可以认为是一个很长的字符串)读进来,并且“切”成小段(每一段就是一个词法单元 token),每个单元都是有具体的意义的,例如表示某个特定的关键词,或者代表一个数字。而这个词法单元在源程序中对应的文本,就叫做“词素”。
token就是把程序的语句进行类似分词得到的单词。
作者::老哇的爪子Attilax艾龙,EMAIL:1466519819@qq.com
转载请注明来源: http://blog.csdn.net/attilax
1.1. 扫描器
词法分析的第一阶段即扫描器,通常基于有限状态自动机。 扫描器能够识别其所能处理的单词中可能包含的所有字符序列(单个这样的字符序列即前面所说的“语素”)。例如“整数”单词可以包含所有数字字符序列。很多 情况下,根据第一个非空白字符便可以推导出该单词的类型,于是便可逐个处理之后的字符,直到出现不属于该类型单词字符集中的字符(即最长一致原则)。
尽管在某些情况下需要手工编写词法分析器,一般情况下词法分析器都用自动化工具生成。
HTMLTokenizer的处理,它是利用有穷状态自动机来完成词法解析的,把解码后的字符串作为输入,输出一个个的HTMLToken的。
致可以知道了HTMLToken中其实就是保存了输入流中被分出的几段数据,这些数据会用于构建DOM的节点。这些数据抽象为类型,数据,属性结合的一条记录。
,HTML的词法分析就是利用HTMLTokenizer中的状态机来实现的。而HTML的语法分析则是根据HTMLToken的类型,以及 HTMLTreeBuilder中的状态机来识别的,然后根据识别到的类型情况,来创建一个具体的Node,并在创建该Node后,把其插入到DOM树的 相应的位置上,完成语法分析,生成一个DOM树作为语法树。
2. 单词流必须识别为保留字,标识符(变量),常量,操作符(运算符 )和界符五大类
2.1. 操作符(运算符 ):::
() [] -> .
? : |
条件 |
由右向左 |
() [] -> . |
括号(函数等),数组,两种结构成员访问 |
由左向右 |
, |
逗号(顺序) |
||
+ - |
加,减 |
由左向右 |
括号,纺括号
参考
编译器DIY——词法分析 - GodLike - 博客频道 - CSDN.NET.htm
2.2. 4.界符:“;”分号,“{}”大括号,单引号,双引号
3. 如何进行词法分析?
A: 一种很简单的思路就是,用一个状态保存在处理到各个字符时的状态,比如是标识符或者数字或者空格等等,直到状态改变到可以认定是不同token的时候结束。
可以肯定的是,必然要对需要处理的数据挨个字符判断,然后在恰当的位置截断,得到一个个的token.
这里的核心在于将不同符号对应的字符给区别开,在一个字符无法表达此符号时将它截断,token形成。
3.1. 使用Fsm状态机(自动机)
4. 词法分析器框架选型
4.1. 语法分析器
4.2. lex
4.3. flex词法分析器
以计算器来举例,12+34*9 这一段“源程序”的词法分析过程如下所示:
图 2 算式的词法分析过程
一段对计算机来说豪无意义的字符串,经过语法分析后就得到了略微有意义的 Token 流。digit 就表示这个词法单元对应的是数字,operator 则表示操作符,后面相应的数字和符号(粉色背景)就是词素。同时,程序中一些不必要的空白、注释也可以由词法分析器来过滤掉,这样,之后的语法分析等步骤 处理起来就会容易得多。
使用antlr或者javacc来生成词法分析器比较简单,自己写实在是很麻烦的事情
开源的LL(K)语法/词法分析器—ANTLR
4.4. 1 ANTLR简介
ANTLR—A, 其前身是PCCTS,它为包括Java,C++,C#在内的语言提供了一个通过语法描述来自动构造自定义语言的识别器(recognizer),编译器 (parser)和解释器(translator)的框架。ANTLR可以通过断言(Predicate)解决识别冲突;支持动作(Action)和返回 值(Return Value)来;更棒的是,它可以根据输入自动生成语法树并可视化的显示出来(这一点我将在下面的例子中演示)。由此,计算机语言的翻译变成了一项普通的 任务—在这之前YACC/LEX显得过于学院派,而以LL(k)为基础的ANTLR虽然在效率上还略有不足,但是经过近些年来的升级修改,使得ANTLR 足以应付现存的绝大多数应用。感谢Terence Parr博士和他的同事们十几年来的出色工作,他们为编译理论的基础和语言工具的构造做了大量基础性工作,也直接导致了俄ANTLR的产生。nother Tool for Language Recognition
正则表达式 正则表达式 被认 为 是文本处理的 首选 工具,当我们使用正则表 示 式时, 首先 定义 一个正则表达式, 然 后 和 预期 文本 进行 匹配 , 最 终再按照 正则表 示 式 中 的 分 组 , 逐 一 获 取 相匹配 的 数 据 , 然 后 再 进行下 一 步 的处理( 输出 、 替 换 等等 )。在 进行 比 较复杂 一些的 问题 时,使用正则表达式, 整体 处理 过 程比 较漫长 ,有时 为了 处理一个 问题 ,写 出 的正则表达式 晦涩难懂 , 很 不 便 于 维护 。 词法分析器 在 Antlr 中词法分析器 使用 了 和语 法分析器 相 同 的 技术 来 构造 , 对词法 记 号 Token 的 匹配 使用 了 递归 下 降 的 策略 ,使 得 词法分析器 具有处理 上下 文 无关 文 法 的能 力 , 而 正则表达式 所 能处理的文 法 只包含 正则文 法 ( 线性 文 法 ), 因此 词法分析器 可 以 处理 很 多正则表达式 难 以 处理的 问题 ,比如 左括 号 和 右括 号 的成 对 匹配 等 。 此外 ,在 Antlr 中词法分析器所 要 匹配 的 词法 记 号 , 通 过 相互引 用的 方 式 进行 嵌套 和 递归 定义 ,比正则表达的 书 写 更直观 , 更加便 于 维护 。 总 的 来说 ,使用 Antlr 词法分析器 处理文本和正则表达式 相 比,处理能 力更 强大, 便 于开发和 测试 ,在本文的 后续 部 分中 ,我们一起 来 看 一 下 如何使用 Antlr 词法分析器 完成抽取、转换、重写 这 三 类文本处理工作
4.5. antlr韩式javacc
Antlr百度为您找到相关结果约1,640,000个
是javacc的两倍...所以,韩式antlr...
在文 件 的 第 一 行 使用 两 个 Antlr 的 关 键 字 lexer grammar 声 明 这是一个 词法 文 件 ,如
唯 一 需 要 注 意 的是 词法 的 名称必须 和文 件 名称 一 致 , 否 则 Antlr 生 成 词法分析器 时 会 报错 , 错误 类 似 于 SqlExtrator.g contains grammar xxx; names must be identical ,这 里 统 一使用 SqlExtrator 。
4.6. Antlr 简介
1. ANTLR 语言识别的一个工具 (ANother Tool for Language Recognition ) 是一种语言工具,它提供了一个框架,可以通过包含 Java, C++, 或 C# 动作(action)的语法描述来构造语言识别器,编译器和解释器。 计算机语言的解析已经变成了一种非常普遍的工作,在这方面的理论和工具经过近 40 年的发展已经相当成熟,使用 Antlr 等识别工具来识别,解析,构造编译器比手工编程更加容易,同时开发的程序也更易于维护。
2. 语言识别的工具有很多种,比如大名鼎鼎的 Lex 和 YACC,Linux 中有他们的开源版本,分别是 Flex 和 Bison。在 Java 社区里,除了 Antlr 外,语言识别工具还有 JavaCC 和 SableCC 等。
算术表达式中用到了 4 类记号 ( 在 Antlr 中被称为 Token),分别是标识符 ID,表示一个变量;常量 INT,表示一个常数;换行符 NEWLINE 和空格 WS,空格字符在语言处理时将被跳过,skip() 是词法分析器类的一个方法。如清单 3 所示:
4.6.1.1.1. 清单 3. 记号定义
ID : ('a'..'z' |'A'..'Z')+ ; INT : '0'..'9' + ; NEWLINE:'\r' ? '\n' ; WS : (' ' |'\t' |'\n' |'\r' )+ {skip();} ;
5. 参考
开源语法分析器--ANTLR - 薛笛的专栏 - 博客频道 - CSDN.NET.htm
词法分析 - 维基百科,自由的百科全书.htm
( 详细 ) 词法分析(字符串分析) - Thinker - BlogJava.htm
浏览器探究——webkit部分——解析HTML(3)HTMLToken的处理 - 落魂的专栏 - 博客频道 - CSDN.NET.htm
C# 词法分析器(一)词法分析介绍 update 2014.1.8 - CYJB - 博客园.htm
词法分析(NFA与DFA) - woaidongmao - C++博客.htm
Java开源语法分析生成器分类列表.htm
(详细) 使用 Antlr 处理文本_百度文库.htm
(ibm 详细)使用 Antlr 开发领域语言.htm
词法分析,让状态机旋转地更猛烈些吧----小话c语言(21) - 陈曦的分享 - 博客频道 - CSDN.NET.htm
词法分析(Java实现)不用状态机 - 0≡(-∞,+∞) - 博客频道 - CSDN.NET.htm
atitit.词法分析的实现token attilax总结的更多相关文章
- atitit.TokenService v3 qb1 token服务模块的设计 新特性.docx
atitit.TokenService v3 qb1 token服务模块的设计 新特性.docx 1.1. V3 新特性1 1.2. V2 新特性1 2. Token的归类1 3. Token的用途 ...
- Atitit.词法分析的原理 理论
Atitit.词法分析的原理 理论 1. 分词 .词法分析lexical analysis 1 1.1. 分词主要流程 1 1.2. 分词的属性如下表token 1 1.3. 词法分析器主要包括:构造 ...
- atitit.词法分析原理 词法分析器 (Lexer)
atitit.词法分析原理 词法分析器 (Lexer) 1. 词法分析(英语:lexical analysis)1 2. :实现词法分析程序的常用途径:自动生成,手工生成.[1] 2 2.1. 词法分 ...
- Atitit 编程语言原理与概论attilax总结 三大书籍总结
Atitit 编程语言原理与概论attilax总结 三大书籍总结 编程语言原理(第10版) 目录: 第1章 预备知识第2章 主要程序设计语言的发展第3章 描述语法和语义第4章 词法分析和语法分析第5章 ...
- Atitit 编程语言原理与概论attilax总结
Atitit 编程语言原理与概论attilax总结 1. 语言的分类1 2. 语言评价标准1 3. 编程语言原理(第10版) 目录: 2 4. 代码之髓:编程语言核心概念2 5. <编程语言实现 ...
- Atitit.词法分析的理论原理 part2
Atitit.词法分析的理论原理 part2 1. 转换图1 1.1. 转换图是由程序流程图改进而成的.同样,转换图也可以等价地转换为程序流程图3 1.2. 2.2.3 构造词法分析器(2)流程程 ...
- Atitit 管理原理与实践attilax总结
Atitit 管理原理与实践attilax总结 1. 管理学分类1 2. 我要学的管理学科2 3. 管理学原理2 4. 管理心理学2 5. 现代管理理论与方法2 6. <领导科学与艺术4 7. ...
- Atitit 图像处理的摩西五经attilax总结
Atitit 图像处理的摩西五经attilax总结 1. 数字图像处理(第三版)1 2. 图像处理基础(第2版)(世界著名计算机教材精选)1 3. 计算机视觉特征提取与图像处理(第三版)2 4. Op ...
- Atitit opencv版本新特性attilax总结
Atitit opencv版本新特性attilax总结 1.1. :OpenCV 3.0 发布,史上功能最全,速度最快的版1 1.2. 应用领域2 1.3. OPENCV2.4.3改进 2.4.2就有 ...
随机推荐
- SharePoint 在中国为什么吃不开?
1.功能不完善,二次开发费时费力?2.没有完整的解决方案,案例太少,很多企业不敢下手?3.国内人员,操作性比较差,不愿意接受SharePoint的操作方式?4.价格太贵,小型企业花费性价比不高?5.界 ...
- 【GISER&&Painter】Chapter01:WebGL渲染初体验
基于上一篇OpenGL的渲染原理,这两周又陆续接触了一些关于WebGL绘图的一些内容,因为刚入门,很多东西又很晦涩,所以特意花了小半天的时间整理了一下,特此记录. 零 画一个多边形吧! 把一个多边形 ...
- 用10张图来看机器学习Machine learning in 10 pictures
I find myself coming back to the same few pictures when explaining basic machine learning concepts. ...
- 用mappedbytebuffer实现一个持久化队列【转】
自从前段时间的一个事故让队列里缓存的大量关键数据丢失后,一直琢磨着弄一个能持久化到本地文件的队列,这样即使系统再次发生意外,我也不至于再苦逼的修数据了.选定使用mappedbytebuffer来实现, ...
- iOS:切换视图时,反向传递数据方法一:通知
通知方式: 1.有一个(单例)通知中心,负责管理iOS中的所有通知 2.需要获取某种通知,必须注册成为观察者(订阅) 3.不再需要取某种通知时,要取消注册. 4.你可以向通知中心发送某种通知,通知中心 ...
- 【React】初识React
React是什么 React是如今(2015年)最热门的前端技术. 在React中.一切皆组件. A JavaScript library for building user interfaces R ...
- C#控件一览表
C#控件一览表 .窗体 .常用属性 ()Name属性:用来获取或设置窗体的名称,在应用程序中可通过Name属性来引用窗体. () WindowState属性: 用来获取或设置窗体的窗口状态. 取值有三 ...
- Apache多站点配置教程
看见这个版关于网络程序方面的文章还比较少,下面来一发~实践证明,本教程适用于Apache 2.2.22,其他版本相差应该不大 我的博客:http://wislab.net/,希望跟大家多多交流噢 Ap ...
- 算法笔记_030:回文判断(Java)
目录 1 问题描述 2 解决方案 1 问题描述 给定一个字符串,如何判断这个字符串是否是回文串? 所谓回文串,是指正读和反读都一样的字符串,如madam.我爱我等. 2 解决方案 解决上述问题,有 ...
- 跟踪数据库中执行时间超过1.5秒的语句及SP,导入数据库
跟踪 --============================================================================ --新建两个目录 D:\InOut\ ...