深入浅出编译原理-3-词法分析器
引言
编译器的工作的开始,就是读入源码(预编译先不考虑),然后,去除一些空字符,然后经过词素匹配,并和其属性(可选),组成一个的词法单元,多个词法单元,连接成词法单元序列。自此,此法分析器的工作就算完成了。呵呵,就这么简单。可见,找到一个词素,是词法分析器的核心工作,那,如何获得一个词素呢?就是本节要讨论的主要内容。
3.1工作流程
上面已经简单描述了词法分析器的工作流程,下面是一张图,更直观的表示了这个流程:
以一条简单的c语言的程序块为例,来展现词法分析器的过程:
3.2内在机制
为了能得到一个符合语言描述的规范的词素,并没有想象的那么简单“不就是得到一个字符串嘛!”,呵呵,咱们错了,这是一项艰巨的任务,由下图标示:
下面是此法分析器的内在机制一张图:
1》首先,要确定一个词素,就是读到一个字符串和模式匹配,
2》模式由DFA来描述。(DFA:确定的有穷自动机)
3》DFA又可以标示为状态转移图
4》状态图又可以通过正则表达式来生成
5》正则表达式是通过语言的文法产生式转换来的
6》文法产生式,又是由编程语言本身来定义的。
需要说的是,编译原理是比较复杂的,要知道DFA,就要学习离散数学;要知道状态图,就要知道‘图’,就是要学习数据结构;还要会正则表达式;还要会编程语言,等等,这些都要有所涉猎。所以编译原理的学习,稍微有点难度,遇到一个概念,就要学习这个概念对应的知识点。况且,这只是词法分析器,后面还有语法分析器,代码优化算法,计算机的体系结构方面的知识。不过不要灰心,只要静下心来,慢慢来,可能学完之后,咱们可能并不能自己去写一个编译器,但是,我想,对于自己写代码优化方面,IC设计方面,一定会有所帮助。
3.3小结
词法分析器的核心,就是找出和模式匹配的词素。要想知道模式描述,就要把具体的编程语言一般描述,先转化问文法,然后文法产生式,然后正则表达式,然后状态转移图,然后DFA。
词素找到了,还要创建符号表,并和词素的属性,组成词法单元,然后组成词法单元序列,最后把序列传给语法分析器,生成抽象语法树,这,就是下一小节打算说的内容。
深入浅出编译原理-3-词法分析器相关推荐
- 编译原理算符分析器实现 -* c语言代码,编译原理论文-词法分析器的设计与实现...
<编译原理论文-词法分析器的设计与实现>由会员分享,可在线阅读,更多相关<编译原理论文-词法分析器的设计与实现(13页珍藏版)>请在人人文库网上搜索. 1.编译原理论文题 目 ...
- 【编译原理】词法分析器语法分析器
简单编译器设计 采用Java语言对C++语言进行编译,具体的简单编译器设计 词法分析器-扫描器的设计与实现 基本符号表 状态转换图 代码实现 import java.io.*; import java ...
- 编译原理之词法分析器随笔和简单实现
借鉴: 编译原理之美. 极客时间上 什么是词法分析 编译原理:词法分析简单的来说就是在字符串中提取一系列的word单词. 编译器的眼里, 我们的一切输入都是什么? 都是一个一个的字符串. 所以编译 ...
- 编译原理——构造词法分析器(基于 Flex 构造和手工构造)
文章目录 一.概述 二.基于 Flex 构造词法分析器 2.1 需求描述 2.2 编译流程 2.3 Flex 代码 三.手工构造词法分析器 3.1 需求描述 3.2 实现流程 3.3 C++ 代码 四 ...
- c语言语法分析源程序,深入浅出编译原理-5-一个简单语法分析器的C语言实现
引言 前面已经介绍了编译器的预处理,词法分析,词法分析器的实现,也在其中说到了语法分析的任务和过程. 语法分析的输入是词法单元序列,然后根据语言的文法表示(展开式),利用有限状态机理论,生成抽象语法树 ...
- 编译原理实验 —— 词法分析器
// Lexical_Analysis.cpp : 定义控制台应用程序的入口点. // #include "stdio.h" #include "stdlib.h&quo ...
- 编译原理,词法分析器
简单的词法分析器 词法分析后的结果 词法分析的过程 词法分析程序 词法分析后的结果 对一个源程序进行词法分析,得到一个二元式,单词的符合,以及对应的内码值 词法分析的过程 程序一开始的时候,先对那些常 ...
- 我看过的编译原理方面的好文章
本文不定期更新,最后更新于2019-7-6 编译原理 编译原理三大经典书籍(龙书 虎书 鲸书) 前端为什么要会正则表达式 - 知乎 一次性搞懂JavaScript正则表达式之引擎 - 掘金 没有AST ...
- 编译原理——词法分析
根据上课内容顺序写的博客,并不是按照书的目录来的 使用龙书以及编译程序设计原理(第二版)金成植.金英编著 老师的PPT是英文的,我自己随便翻的,不一定对 文章目录 词法分析(scanning) 概述 ...
最新文章
- 敏捷开发中Scrum方法
- android 之适配器与json对象解析技术的联用的进一步优化(解决图片错位)
- Ubuntu Server中怎样卸载keepalived
- Linux学习笔记6
- 原字体_在包装上玩转字体
- 电大计算机网考选择题多少分,2016年度电大计算机网考选择题及标准答案.doc
- Python通过Zabbix API获得数据
- WCF 进阶: 对称加密传输
- django动态HTML转PDF方法
- 设计模式---中介者模式(C++实现)
- html 如何在按钮中加字,html button标签 语法
- LiteIDE简单使用
- 八.声明圆锥体类,实现Area和vloume接口计算表面积和体积,按体积大小进行比较...
- 关于msp430系列单片机的一些入门心得(新手向)
- 日常问题:上传接口报错
- 常用git命令指南总结
- 虚拟机下克隆CentOS引起的MAC地址冲突问题
- 《linux内核分析》第三次课 实验作业
- 服务器启动时创建文件夹,技术|entr:文件更改时重新运行构建
- Linux下查找结构体定义的位置