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