词法分析器

编译原理实验一 词法分析

烂漫一生 提交于 2020-01-29 12:28:57
一、 实验目的 编制一个读单词过程,从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分隔符五大类。并依次输出各个单词的内部编码及单词符号自身值。 二、 实验题目 如源程序为C语言。输入如下一段: main() { int a=-5,b=4,j; if(a>=b) j=a-b; else j=b-a; } 要求输出如下: (” main ” , 1 , 1 ) (”(” , 5 ) (”)” , 5 ) (” { ” , 5) (” int ” , 1 , 2 ) (” a ” , 2 ) (” = ” , 4 ) (” -5 ” , 3 ) (” , ” , 5 ) (” b ” , 2 ) (” = ” , 4 ) (” 4 ” , 3 ) (” , ” , 5 ) (” j ” , 2 ) (” ; ” , 5 ) (” if ” , 1 ) (”(” , 5 ) (” a ” , 2 ) (” >= ” , 4 ) (” b ” , 2 ) (”)” , 5 ) (” j ” , 2 ) (” = ” , 4 ) (” a ” , 2 ) (” - ” , 4 ) (” b ” , 2 ) (” ; ” , 5 ) (” else ” , 1 ) (” j ” , 2 ) (” = ” , 4 ) (” b ” , 2 ) (” - ” ,

C语言11-词法分析器

僤鯓⒐⒋嵵緔 提交于 2020-01-27 04:06:05
文章目录 关于单词统计 词法分析器 状态机转化为代码的常见方法就两种: 判断词性的同时,拿到单词字符串 关于单词统计 因为连续空格算做一个。常规的算法如下: 选择一个标志,记录当前的是否为空格的状态,在状态切换之间,进行单词统计 代码实现如下: #include "stdafx.h" //统计单词个数 unsigned CountNumber(char* szInput) { unsigned nRet = 0; char* pszChValue = szInput; int nIsSpaceFlag = 0;//所选择的状态标志来判断是否可以确定是下一个单词 while (*pszChValue != '\0') { char chValue = *pszChValue; if (chValue == ' ') { if (nIsSpaceFlag != 1) { nRet++; } else { //meidongzuo } nIsSpaceFlag = 1; } else if (chValue != ' ') { nIsSpaceFlag = 0; } pszChValue++; } if (nIsSpaceFlag == 0) { nRet++; } return nRet; } int main(int argc, char* argv[]) { unsigned

编译原理(词法分析)

…衆ロ難τιáo~ 提交于 2020-01-22 09:05:09
文章目录 1.编译原理概述 2.词法分析 正规集 正规式 正规文法 自动机 已知集合求正规式、DFA; 已知正规式求DFA、集合; 已知DFA求正规式、集合; DFA的确定化、最小化。 1.编译原理概述 程序设计语言的翻译模式:编译、汇编;转换(预处理);反汇编、反编译;交叉编译、交叉汇编 静态语义错误(如分母不为0)在语义分析阶段可以被检测出来 词法分析里的坑点,因为词法分析只是识别记号,它并不会排查声明变量结构性错误,这个错误要到语法分析之中才可以被检查出来 动态语义错误编译过程中一般不会处理,只有到程序执行时才会发现 几个错误的典型实例 对程序语句的翻译主要考虑两类语句:声明语句和可执行语句,其中,对声明语句,主要是将所需要的信息正确地填入合理组织的 符号表 中;对可执行语句,则是 翻译成中间代码 在以阶段划分的编译器中, 符号表管理 和 出错处理 两个阶段的工作贯穿于编译器工作始终。 有两个因素使得有限自动机是不确定的,一个是 具有ε状态转移 ,另一个是对同一字符, 可能有多于一个的下一状态转移 词法分析器有四个作用,请给出其中的任意两个: 识别记号并交给语法分析器 / 滤掉源程序中的无用成分 / 处理与具体平台有关的输入 / 调用符号表管理器或出错管理器 语法分析器根据语法规则 识别出记号流中的结构 ,并 构造一棵能够正确反映该结构的语法树 。 检查输入中的错误

LEX和YACC的使用三

我是研究僧i 提交于 2020-01-21 03:27:52
2.4.3 yacc解决二义性和冲突的方法 在2.3.8中已涉及到二义性和冲突的问题,这里再集中介绍一下,这在写Yacc源程序时会经常碰到。二义性会带来冲突。在2.3.8中我们介绍了yacc可以用为算符确定优先级和结合规则解决由二义性造成的冲突,但是有一些由二义性造成的冲突不易通过优先级方法解决, 如有名的例子: stat:IF bexp THEN stat |IF bexp THEN stat ELSE stat ; 对于这样的二义性造成的冲突和一些不是由二义性造成的冲突,Yacc提供了下面两条消除二义性的规则: A1.出现移进/归约冲突时,进行移进; A2. 出现归约/归约冲突时,按照产生式在yacc源程序中出现的次序,用先出现的产生式归约。 我们可以看出用这两条规则解决上面的IF语句二义性问题是合乎我们需要的。所以用户不必将上述文法改造成无二义性的。当Yacc用上述两条规则消除了二义性,它将给出相应信息。 下面再稍微严格地介绍一下Yacc如何利用优先级和结合性来解决冲突的。 Yacc源程序中的产生式也有一个优先级和结合性.这个优先级和结合性就是该产生式右部最后一个终结符或文字字符的优先级和结合性,当使用了%Prec子句时,该产生式的优先级和结合性由%Prec子句决定。当然如果产生式右部最后一个终结符或文字字符没有优先级或结合性,则该产生式也没有优先级或结合性。 根据终结符

词法与文法简介

喜欢而已 提交于 2020-01-15 19:27:05
https://zhuanlan.zhihu.com/p/19878087 https://segmentfault.com/a/1190000015568992 词法简介 所谓的源代码,我们可以将其视为一段长长的字符串。所谓字符串,即是字符的有序集。但是,字符本身作为编译器的输入单位,粒度实在太小了,因此,我们往往需要对编译器进行第一层封装,即分割出一个称之为 Tokenizer (词法分析器)的部分。 Tokenizer 的作用即是将字符序列翻译成 Token(单词)的一个过程,这一过程称之为 单词化 (Tokenization)。很容易理解单词化这一步骤在整个编译过程中的价值,举个例子,如下这么一个英语句子。 It’s understandable that we share some common values as we are living in the same world. 实际上,这个句子倘若以字符串的形式存在,即以 字符 作为最小单位来解析,则看起来形式如下。实际上,我们很难从中提取出有价值的信息。 ['I', 't', '\'', 's', ' ', 'u', 'n', 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', 'a', 'b', 'l', 'e', ' ', 't', 'h', 'a', 't', ' ', 'w',

Atitit.词法分析的理论原理 part2

谁说胖子不能爱 提交于 2020-01-12 16:54:33
Atitit. 词法分析的理论原理 part2 1 . 转换图 1 1 .1. 转换图是由程序流程图改进而成的。同样,转换图也可以等价地转换为程序流程图 3 1 .2. 2.2.3 构造词法分析器(2)流程 程序2-1虽然只有26行,却是词法分析器的核心 4 1 .3. 单词存储形式就是三元组(单词 ID ,单词备注,单词行号)。 4 1 .4. 单词流是如何传递给语法分析器的。 5 1 .5. 词法定义 5 1 .6. 词法分析器主要包括:构造转换图与转换表、设计词法分析器算法。 6 1 .7. 超前搜索几个字符与词法定义有关,有些设计不精良的语言可能需要超前搜索三个甚至四个字符才能正确识别单词 7 1. 转换图 从图2-2中,不难发现,其中只有"搜索指针后移一个字符"一种处理动作(方框)。那么,读者不妨想象一下,词法分析器是否就只有这种处理动作呢?仔细分析手工识别单词的过程后,就可以发现事实确实如此。既然词法分析器的流程中条件判断(菱形框)比较复杂,而处理动作非常单一,因此,可以将普通流程图改造成一种专门用于描述条件判断的流程图。具体改造步骤如下: 1)把图2-2中所有上、下菱形(判断)之间的箭头用圆表示。 2)把图2-2中所有的菱形直接用箭头线表示,箭头上写上原菱形的判断成立与否的条件,即可得到图2-3。 图2-3 识别Pascal标识符的状态转换图 这里省略了出错处理

自己动手开发编译器(四)利用DFA转换表建立扫描器

回眸只為那壹抹淺笑 提交于 2020-01-12 16:53:33
上回我们介绍了两种有穷自动机模型——确定性有穷自动机DFA和非确定性有穷自动机,以及从正则表达式经过NFA最终转化为DFA的算法。有些同学表示还是难以理解NFA到底怎么转化为DFA。所以本篇开头时我想再多举一个例子,看看NFA转化为DFA之后到底是什么样。首先我们看下面的NFA,它是从一组词法分析所用的正则表达式转换而来的。这个NFA合并了IF、ID、NUM、error这四个单词的NFA。因此,它的四个接受状态分别代表遇到了四种不同的单词。 用上一篇学到的方法,我们需要求出一个DFA,它的每个状态都是NFA状态集合的一个子集。首先我们要定义任何状态的ε-闭包,之所以叫ε-闭包,是因为它对ε转换而言是封闭的,也就是说ε-闭包内任何状态,经过ε转换之后,都还是闭包内的一个状态。接下来,从初始状态ε-闭包开始,我们要计算输入任何一种字符后,NFA所能转换到的下一个状态集合。这一步的公式是: 其中那个U型的符号,表示:对NFA状态集合d中的任何状态s,求出s在遇到符号c之后所能达到的所有状态组成的集合,再把所有这种集合求并集。最后,再对这个集合求出ε-闭包。我很难找出一种更简单的描述方式,简而言之就是要计算出NFA状态集合d,在输入符号c之后,所能达到的一切状态的新集合。而这个集合,就会变成DFA的一个状态,这个状态是从d,沿着一条标有c的边达到的。我们首先求出初始状态的ε

Atitit.词法分析的理论原理 part2

99封情书 提交于 2020-01-12 07:46:18
Atitit. 词法分析的理论原理 part2 1 . 转换图 1 1 .1. 转换图是由程序流程图改进而成的。同样,转换图也可以等价地转换为程序流程图 3 1 .2. 2.2.3 构造词法分析器(2)流程 程序2-1虽然只有26行,却是词法分析器的核心 4 1 .3. 单词存储形式就是三元组(单词 ID ,单词备注,单词行号)。 4 1 .4. 单词流是如何传递给语法分析器的。 5 1 .5. 词法定义 5 1 .6. 词法分析器主要包括:构造转换图与转换表、设计词法分析器算法。 6 1 .7. 超前搜索几个字符与词法定义有关,有些设计不精良的语言可能需要超前搜索三个甚至四个字符才能正确识别单词 7 1. 转换图 从图2-2中,不难发现,其中只有"搜索指针后移一个字符"一种处理动作(方框)。那么,读者不妨想象一下,词法分析器是否就只有这种处理动作呢?仔细分析手工识别单词的过程后,就可以发现事实确实如此。既然词法分析器的流程中条件判断(菱形框)比较复杂,而处理动作非常单一,因此,可以将普通流程图改造成一种专门用于描述条件判断的流程图。具体改造步骤如下: 1)把图2-2中所有上、下菱形(判断)之间的箭头用圆表示。 2)把图2-2中所有的菱形直接用箭头线表示,箭头上写上原菱形的判断成立与否的条件,即可得到图2-3。 图2-3 识别Pascal标识符的状态转换图 这里省略了出错处理

PASCAL语言子集的词法、语法分析器之实现

試著忘記壹切 提交于 2020-01-10 09:27:35
针对简单的文法(PASCAL语言子集),制作相应的词法分析器和递归下降的语法分析器。 文法要求如下: 1、 关键字、标识符、数字等: 1.begin 2.if 3.then 4.while 5.do 6.end 10. 标识符 11. 数字 13.+ 14.- 15.* 16./ 17.: 18.:= 20.< 21.<> 22.<= 23.> 24.>= 25.= 26.; 27.( 28.) 2、 文法规则 : 程序 → begin 语句串 end 语句串 → 语句 { ; 语句 } 语句 → 赋值语句 | 条件语句 | 循环语句 赋值语句 → 变量 := 表达式 条件语句 → if 条件 then ( 语句 | 程序 ) 循环语句 → while 条件 do ( 语句 | 程序 ) 表达式 → 项 { + 项 | - 项 } 条件 → 表达式 关系符 表达式 关系符 → < | <> | <= | > | >= | = 项 → 因子 { * 因子 | / 因子 } 因子 → 变量 | 数字 | ( 表达式 ) 变量 → 标识符 一、 词法分析器 词法分析器的任务是清除源文件中多余的空格、换行、制表符等,识别文法符号。按顺序输出识别的标识符及其种别编号,供语法分析器调用。 代码如下: #include <stdio.h> #include <string.h> #include

atitit.词法分析原理 词法分析器 (Lexer)

♀尐吖头ヾ 提交于 2020-01-09 12:56:38
atitit. 词法分析 原理 词法分析器 (Lexer) 1 . 词法分析 (英语: lexical analysis ) 1 2 . ;实现词法分析程序的常用途径 : 自动生成 , 手工生成 . [1] 2 2 .1. 词法分析程序的功能 2 2 .2. 如何描述词素 3 2 .3. 单词 token 3 2 .4. Token 的类型 ,根据程序设计语言的特点,单词可以分为五类:关键字、标识符、常量、运算符、界符。以 4 2 .5. 词法分析 的第一阶段即扫描器 4 2 .6. 词法分析 的第 二 阶段 评估器( Evaluator ) 5 2 .7. 例如 C语言程序段的词法分析结果 5 2 .8. 最长原则 6 2 .9. 词法单元的识别 6 2 .10. 不确定 ” ( Nondeterministic Finite Automata ,NFA 8 2 .11. 转换图(transition graph)的表示 9 2 .12. 词法分析 (3)---DFA 10 2 .13. 为什么要 NFA 转 DFA 12 2 .14. 则表达式转 NFA 13 2 .15. 正则表达式如何转换为NFA呢?有几个公式 (MLS2007[1]): 13 2 .16. 构造词法分析器了。大致的流程如下: 19 2 .17. 常用的 token scanner 19 2 .18.