编译原理------词法分析器C/C++代码实现

2023-11-04

一、实验目的

设计、编制并调试一个词法分析程序,加深对词法分析原理的理解。

二、实验内容

2.1 待分析的简单的词法

(1)关键字:

 begin  if  then  while  do  end

所有的关键字都是小写。

(2)运算符和界符

: =  +  -  *  /  <  <=  <>  >  >=  =  ; (  )  #

(3)其他单词是标识符(ID)和整型常数(SUM),通过以下正规式定义:

ID = letter (letter | digit)*

NUM = digit digit*

(4)空格有空白、制表符和换行符组成。空格一般用来分隔ID、SUM、运算符、界符和关键字,词法分析阶段通常被忽略。

2.2 各种单词符号对应的种别码:

表2.1 各种单词符号对应的种别码

单词符号

种别码

单词符号

种别码

bgin

1

17

If

2

:=

18

Then

3

<

20

wile

4

<>

21

do

5

<=

22

end

6

>

23

lettet(letter|digit)*

10

>=

24

digit digit*

11

=

25

+

13

26

14

(

27

*

15

)

28

/

16

#

0

2.3 词法分析程序的功能:

输入:所给文法的源程序字符串。

输出:二元组(syn,token或sum)构成的序列。

其中:syn为单词种别码;

      token为存放的单词自身字符串;

      sum为整型常数。

例如:对源程序begin x:=9: if x>9 then x:=2*x+1/3; end #的源文件,经过词法分析后输出如下序列:

(1,begin)(10,x)(18,:=)(11,9)(26,;)(2,if)……

 

程序中需要用到的主要变量为syn,token和sum。

①token用来存放构成单词符号的字符串;②sum用来整型单词;③syn用来存放单词符号的种别码。

#include <iostream>
#include <string.h>
using namespace std;
char key[6][20] = {"begin","if","then","while","do","end"};//定义一个二维数组存放关键字 
char token[20];	//存放字符(单词) 
//判断关键字 
int isKey(char s[])
{
	for(int i = 0; i<6;i++)
	{
		if(strcmp(s,key[i]) == 0)
		{
			return i+1;	//关键字的种别码依次为 begin=1,if=2,then=3,while=4,do=5,end=6即为 i+1 的值 
		}
	}
	return -1;
}
//判断是不是字母 
bool isChar(char ch)
{
	if((ch>='a' && ch<='z') || (ch>='A' && ch<='Z'))
	return true;
	else return false;
}
//判断是不是数字 
bool isNum(char ch)
{
	if(ch>='0' && ch<='9')
	return true;
	else
	return false;
}
//核心子程序
void scanner(int &syn,int &p,char s[])
{
	int count = 0;
	if(s[p] == ' ') p++;
	//开头是字母
	if(isChar(s[p]))
	{
		while(isNum(s[p]) || isChar(s[p]))
		{
			token[count++] = s[p];
			p++;
		}
		token[count] = '\0';	//'\0'作为结束符 ,将单词分隔开 
		syn = isKey(token);
		if(syn == -1)	
		{
			syn = 10;	//标识符letter(letter|digit) *
		}
	}
	
	//开头是数字
	else if(isNum(s[p]))
	{
		while(isNum(s[p]))
		{
			token[count++] = s[p];
			p++;
		}
		token[count] = '\0';//结束标识 
		syn = 11;	//数字digit(digit) *
	}
	
	//如果是运算符或者界符
	else
	{	
		//先处理没有争议的字符 
		switch(s[p])
		{
			case '+': syn = 13;token[0] = s[p];token[1]='\0';break;
			case '-': syn = 14;token[0] = s[p];token[1]='\0';break;
			case '*': syn = 15;token[0] = s[p];token[1]='\0';break;
			case '/': syn = 16;token[0] = s[p];token[1]='\0';break;
			case '=': syn = 25;token[0] = s[p];token[1]='\0';break;
			case ';': syn = 26;token[0] = s[p];token[1]='\0';break;
			case '(': syn = 27;token[0] = s[p];token[1]='\0';break;
			case ')': syn = 28;token[0] = s[p];token[1]='\0';break;
			case '#': syn = 0 ;token[0] = s[p];token[1]='\0';break;
		}
		
		
		//处理有争议的
		//: :=
		if(s[p] == ':')
		{
			token[count++] = s[p];
			if(s[p+1] == '=')
			{
				p++;
				token[count++] = s[p];
				syn = 18;
			}
			else
			{
				syn = 17;
			}
			token[count] = '\0';
		}
		
		//< <> <=
		if(s[p] == '<')
		{
			token[count++] = s[p];
			if(s[p+1] == '>')
			{
				p++;
				token[count++] = s[p];
				syn = 21;
			}
			else if(s[p+1] == '=')
			{
				p++;
				token[count++] = s[p];
				syn = 22;
			}
			else
			{
				syn = 20;
			}
			token[count] = '\0';
		}
		
		//> >=
		if(s[p] == '>')
		{
			token[count++] = s[p];
			if(s[p+1] == '=')
			{
				p++;
				token[count++] = s[p];
				syn = 24;
			}
			else
			{
				syn = 23;
			}
			token[count] = '\0';
		}
		
		//后移 
		p++;	//判断运算符和界符的这部分由于指针 p 没有向后指,所以需要将指针 p 向后移一位 
	}
	 
} 
int main()
{
	char s[100];	//输入字符串 
	while(cin>>s)
	{
		int p = 0;
		int syn;
		while(p < strlen(s))	//循环条件 ,p还未指到字符串最后	
		{
			scanner(syn,p,s);
			cout<<'<'<<token<<','<<syn<<'>'<<endl;
		}
	}
	return 0;
}
 

输入begin x:=9: if x>9 then x:=2*x+1/3; end #

运行结果为:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

编译原理------词法分析器C/C++代码实现 的相关文章

  • 编译原理实验 实验一 词法分析设计 Java实现

    一 实验目的 通过本实验的编程实践 使学生了解词法分析的任务 掌握词法分析程序设计的原理和构造方法 使学生对编译的基本概念 原理和方法有完整的和清楚的理解 并能正确地 熟练地运用 二 实验内容 用 VC VB JAVA 语言实现对 C 语言
  • 静态单赋值(二)—gcc中的SSA化算法

    版权声明 本文为CSDN博主 ashimida 的原创文章 遵循CC 4 0 BY SA版权协议 转载请附上原文出处链接及本声明 原文链接 https blog csdn net lidan113lidan article details
  • 编译原理实验 实验二 LL(1)分析法 Python实现

    1 实验目的 通过完成预测分析法的语法分析程序 了解预测分析法和递归子程序法的区别和联系 使学生了解语法分析的功能 掌握语法分析程序设计的原理和构造方法 训练学生掌握开发应用程序的基本方法 有利于提高学生的专业素质 为培养适应社会多方面需要
  • LLVM里的寄存器分配 - 线性扫描算法(二)

    1 背景介绍 在上一篇博文 LLVM 里的寄存器分配 准备工作 一 里 我主要整理了 LLVM 在做寄存器分配前所做的准备工作 介绍了 LLVM 是在怎样的 MIR 上做的寄存器分配 接下来 就需要讲讲 LLVM 是如何做寄存器分配了 虽然
  • 编译原理------词法分析器C/C++代码实现

    一 实验目的 设计 编制并调试一个词法分析程序 加深对词法分析原理的理解 二 实验内容 2 1 待分析的简单的词法 1 关键字 begin if then while do end 所有的关键字都是小写 2 运算符和界符 lt lt lt
  • Code Block & Basic Block

    Code Block In a programming language a code block typically starts with certain syntactical constructs such as loops con
  • 静态类型推导

    前面说泛型的时候 提到了C 模板的实现方式是动态特性静态化 在实际情况中 这是一个提高效率的好办法 动态性的好处是灵活 开发简便 静态性的特性是效率高 编译期检查较好 因此很自然地就有一个问题 能不能各取所长 达到两全其美 应该说 在一定程
  • 语义分析- C-- 语言

    C V1 0 E gt n true false E E E E 类型合法的程序 3 4 false true 类型不合法的程序 3 true true false 对这个语言 语义分析的任务是 对给定的一个表达式e 写一个函数type c
  • cucu: a compiler u can understand (part 2)

    原文地址 http blog csdn net roger wong article details 8502477 原文地址 http zserge com blog cucu part2 html 到目前为止 我们已经定义了我们语言的语
  • 龙书学习笔记

    目录 第一章 引论 1 1 语言处理器 1 2 一个编译器的结构 1 2 1 词法分析 1 2 2 语法分析 1 2 3 语义分析器 1 2 4 中间代码生成
  • [学习flex] 1.利用flex实现文字和谐小程序

    灵感来自于09平台dota1 游戏选手对喷时经常互飙国粹 问候对方全家 后来09平台进行了聊天和谐 不和谐的文字都会被 替换 今天我就就用flex实现类似的效果 话不多说上flex代码 脏话 printf 国粹 printf printf
  • 【编译原理】LALR(1)语法分析方法(c++实现)

    前文回顾 编译原理 LR 0 分析方法 c 实现 编译原理 SLR 1 分析方法 c 实现 编译原理 LR 1 分析方法 c 实现 这几个程序的代码大部分是一样的 根据不同算法特点做了部分修改而已 代码 LALR 1 的代码就是在LR 1
  • The Backus-Naur Form (BNF) & The Extended Backus-Naur Form (EBNF)

    The Backus Naur Form BNF The Backus Naur Form BNF is a notation used for formal description of the syntax of programming
  • 程序语言翻译器的设计与实现----算术表达式转换四元式(编译原理)

    此篇博客是将前面的内容进行整合并进一步提升 真正实现一个简单表达式语法的编译器 如果有不了解的地方请查看下面链接 词法分析 LR 1 分析 一 LR 1 分析 二 这里说的程序语言编译器是指将算术表达式部分进行翻译 暂时不包括优化以及目标语
  • 编译原理——自顶向下分析中FOLLOW集的计算

    一 FOLLOW集的定义 对于非终结符号A FOLLOW A 被定义为 可能在某些句型中紧跟在A右边的终结符号的集合 为什么说是可能 因为在一些推导出来的文法符号串中 该非终结符号A可能在最右边 比如 A gt TA 如果存在S gt Aa
  • arm-linux-gcc char与signed char和unsigned char

    1 三者关系 1 ANSI C 提供了3种字符类型 分别是char signed char unsigned char 而不是像short int一样只有两种 int默认就是unsigned int 2 三者都占1个字节 3 signed
  • 编译原理三大经典书籍(龙书 虎书 鲸书)

    1 龙书 Dragon book 英文名 Compilers Principles Techniques and Tools 作者 Alfred V Aho Ravi Sethi Jeffrey D Ullman 中文名 编译原理技术和工具
  • 正规表达式与有限自动机

    1 美图 2 概念 3 正规式和正规集 正规集可以用正规表达式 简称正规式 表示 正规表达式是表示正规集一种方法 一个字集合是正规集当且仅当它能用正规式表示 3 1 正规式和正规集的递归定义 4 确定有限自动机 DFA
  • 【编译原理】 CS143 斯坦福大学公开课 第一周:简介

    youtube 1 1 Introduction to Compilers and interpreters 1 1 Introduction to Compilers and interpreters 编译器解释器介绍 两种主要的实现编程
  • 编译原理13:SLR(1)分析表、LR(1)分析表

    更强的LR分析 可以根据当前单词 来选择是移进还是归约 只要所有移进项目中的点后面的那些终结符 与归约项目生成的非终结符的Follow集合的元素没有重叠 若当前单词属于上述Follow集合里则规约 SLR 1 冲突解决办法 SLR 1 分析

随机推荐

  • 【数据结构与算法——TypeScript】树结构Tree

    数据结构与算法 TypeScript 树结构 Tree 认识树结构以及特性 什么是树 真实的树 相信每个人对现实生活中的树都会非常熟悉 我们来看一下树有什么特点 树通常有一个根 连接着根的是树干 树干到上面之后会进行分叉成树枝 树枝还会分叉
  • OpenCV实现人脸识别

    该程序对头像很小的图片效果不是很好 VS2017 OpenCV3 5 主要步骤 1 读取图像 2 转为灰度图 3 直方图均衡化 增加对比度 4 载入分类器 5 检测关于脸部位置 include
  • 地形平滑算法

    地形平滑算法 2013 06 20 18 33 2486人阅读 评论 0 收藏 举报 分类 OGRE 41 C C 10 版权声明 本文为博主原创文章 未经博主允许不得转载 拉出来的地下不平滑怎么办 笨办法就是美工一个顶点一个顶点的调整 而
  • AWB实现流程

    简介 本篇谈论下对AWB算法的调查和预研工作 内容概述 所谓AWB也就是自动白平衡的意思 白平衡在相机中很常见 主要是和色温 色彩还原 色调调整相关 当白平衡设置不佳的时候 常会出现如下这些情况 在日光灯的房间里拍摄的影像会显得发绿 在室内
  • UE5项目打包发布Windows需要安装插件

    一 下图为UE5项目打包发布Windows的安装路劲 前面感叹号为未安装插件 二 打包前的其他可有可无设置 1 编辑Edit 项目设置Project Settings 2 平台Platforms Windows 三 安装路径 1 搜索vis
  • 群晖(docker图形化界面)使用 SpeedTest 测速

    群晖 docker图形化界面 使用 SpeedTest 测速 博主博客 https blog uso6 com https blog csdn net dxk539687357 本文主要介绍在群晖中安装 speedtest 进行网络测速 一
  • 会话跟踪技术:会话Cookie,URL重写和HttpSession

    一 会话跟踪 session tracking 技术 会话是客户端发送请求 服务器返回响应的连接时间段 HTTP是无状态协议 每次都是单独连接 不能维持客户的上下文信息 会话跟踪技术是用于维持客户端和服务器端通信信息的技术 三种典型客户端会
  • 云计算介绍之云计算存储(1)

    文章目录 云计算存储 1 存储架构 1 1存储概念 1 2系统组成 1 系统硬件 2 存储软件 3 存储方案 1 3存储分类 1 3 1 开放系统的存储 1 外挂存储 a Fabric Attached Storage 网络存储 FAS 1
  • TinyPerson数据集json文件改写为xml文件

    TinyPerson NWPU VHR 10或其他同理 数据集文件改写为VOC类型的xml文件 代码转python实现 创作不易 点个赞吧 文章目录 TinyPerson NWPU VHR 10或其他同理 数据集文件改写为VOC类型的xml
  • CentOS 6.3下rsync服务器的安装与配置

    一 rsync 简介 Rsync remote synchronize 是一个远程数据同步工具 可通过LAN WAN快速同步多台主机间的文件 也可以使用 Rsync 同步本地硬盘中的不同目录 Rsync 是用于取代rcp的一个工具 Rsyn
  • WINDOWS SERVER 2012证书服务安装配置

    WINDOWS SERVER 2012证书服务安装配置 首先需要下载一个windows server 2012的镜像 安装虚拟机 来进行证书服务安装之前的准备 在进行安装证书服务之前 首先应该安装配置域服务 否则安装证书服务无法正常安装配置
  • python好学吗?0基础学习python需要那些准备

    Python是一种计算机程序设计语言 你可能已经听说过很多种流行的编程语言 比如非常难学的C语言 非常流行的Java语言 适合初学者的Basic语言 适合网页编程的JavaScript语言等等 那Python是一种什么语言 首先 我们普及一
  • kubernetes1.20版本启用ipvs模式

    在1 19版本之前 kubeadm部署方式启用ipvs模式时 初始化配置文件需要添加以下内容 apiVersion kubeproxy config k8s io v1alpha1 kind KubeProxyConfiguration f
  • (css样式穿透详解)::v-deep的使用

    目录 背景 使用 1 当项目中使用的 css 原生样式 需要使用 gt gt gt 深度选择器来修改 外用第三方组件的样式 2 当项目中使用的 css 扩展语言是 less 需要使用 deep 或者 v deep 深度选择器来修改 外用第三
  • TypeScript超详细入门教程(上)

    TypeScript超详细入门教程 上 01 开篇词 Hello TypeScript 01 开篇词 Hello TypeScript 更新时间 2019 10 30 13 49 46 既然我已经踏上这条道路 那么 任何东西都不应妨碍我沿着
  • ios申请真机调试( xcode 5)详细解析

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 已经有开发证书的直接跳过第一步 第一步 申请 开发证书 进入苹果开发者99美元账号 选择 Certificates Identifiers Profiles 关于 Cert
  • BTC-协议

    防范 double spending attack Distribute consensus distributed hash table 分布式共识 FLP impossibility result 在一个异步的系统里 网络时延没有上限
  • cython优化代码过程问题及解决总结

    1 同样cdef的矩阵还是在Python平台 还是黄色 源 问题 解决1 2 3 1 加上修饰符 cython boundscheck False cython wraparound False 2 数组索引方式 注意这里nodePot0是
  • avue 表单远程搜索、模糊查询

    关于avue的模糊下拉 直接上代码 computed option return emptyBtn false submitBtn false menuSpan 8 menuBtn false column label 经销商名称 labe
  • 编译原理------词法分析器C/C++代码实现

    一 实验目的 设计 编制并调试一个词法分析程序 加深对词法分析原理的理解 二 实验内容 2 1 待分析的简单的词法 1 关键字 begin if then while do end 所有的关键字都是小写 2 运算符和界符 lt lt lt