实验之 词法分析

一、实验目的

(1) 学会针对DFA转换图实现相应的高级语言源程序。
(2) 深刻领会状态转换图的含义,逐步理解有限自动机。
(3) 加深对词法分析原理的理解。
(4) 理解词法分析和语法分析的接口方式。

二、实验内容

编写TPL语言的词法分析程序,它从左到右逐个字符地对源程序进行扫描,分离出一个个单词,存放到数组或链表等存储结构中,作为语法分析的输入,如图1所示。

三、实验要求

要求实现编译器的以下功能:
(1) 能对任何TPL语言源程序进行分析。
(2) 按规则拼单词,识别出各个具有独立意义的单词,即保留字、运算符、标识符、常数、其他界符,并将识别出的单词存放到数组或链表中。
(3) 删除空白符(空格、回车符和制表符)。
(4) 列表打印源程序,打印出每个单词。
(5) 若源程序有错误,则定位错误,并指出错误原因。

四、实验原理

首先分析出TPL语言的单词种类,共五类,如表1所示,然后构造出每类单词的DFA,如图2所示,然后将所有的DFA连接在一起,构成一个整体DFA,如图6所示,根据这个整体DFA状态转换图,我们就可以用C语言直接编写出识别该语言所有单词的词法分析程序。在下面的图中,状态0为初态, 凡带双圈者均为终态,表示已识别出一个单词。代表任一字母,d 代表任一数字。状态22是识别不出单词符号的出错情况。


图2 TPL语言单词集的状态转换图

五、数据结构和函数说明

(一)数据结构

char Keyword[][7]数组,存放关键字的数组

(二)所有函数说明

int reserve(char str[])函数,测试检测出的单词是不是关键字,如果是,该函数返回该关键字的种别编码,如果不是返回-1。
void getsym(FILE *fp)函数,词法分析器的主要函数,该函数接受一个文件指针,功能为对接受的文件进行词法分析,输出单词及其种别编码。

六、实现与测试

(一)被测试的源程序1

if a>b thens:=a+b
elses:=a*b

(二)源程序1的词法分析结果

(三)被测试的源程序2

begin
if today <> 7 then
begintoday:=today+1for i:=1 step 1 until 10 dojc=jc*i
end
else
begintoday:=0for i:=1  step  5  until 100 dojc=jc*i
end
end

(四)源程序2的词法分析结果


七、词法分析程序源码

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
/*各单词种别编码如下:
*关键字:1-15  +16 -17 *18 /19 :=20 =21 <>22 >23 >=24 <25 <=26 整数27 (28 )29 标识符30
*/
#define path "C:\\Users\\86166\\Desktop\\text.txt"     //文件绝对路径
#define MAXWORD 50            //能够分析出的最长单词
#define MAXFILEWORD 500        //用于指定存放文件内容数组的最大容量
char Keyword[][7] = { "begin","end","if","then","else","not","and","or","true","false","while","do","for","step","until"
};
int reserve(char str[])
{for (int i = 0; i<15; i++){if (strcmp(str, Keyword[i]) == 0){return (i + 1);  //关键字的种别码为i+1 的值 }}return -1;                //不是关键字
}void getsym(FILE *fp)
{char ch[MAXFILEWORD];int n = 0;while ((ch[n++] = fgetc(fp)) != EOF);ch[--n] = '\0';    //如果是n的话会把EOF读进来int line = 1;       //记录错误行号int p = 0;while (ch[p] != '\0'){if (ch[p] == '\n')line++;while ((ch[p] == ' ') || (ch[p] == '\n') || (ch[p] == '\t'))p++;int i = 0;char str[MAXWORD] = {};int addr = 0;if (isalpha(ch[p])){do {str[i++] = ch[p++];} while (isalpha(ch[p]) || isdigit(ch[p]));str[i] = '\0';addr = reserve(str);if (addr == -1)addr = 30;printf("%s\t%d\n", str, addr);}else if (isdigit(ch[p])){do {str[i++] = ch[p++];} while (isdigit(ch[p]));   //出循环时,ch[p]已不是数字str[i] = '\0';addr = 27;printf("%s\t%d\n", str, addr);}else if (ch[p] == '<'){if (ch[p + 1] == '=') {str[0] = ch[p];str[1] = ch[p + 1];str[2] = '\0';addr = 26;printf("%s\t%d\n", str, addr);p = p + 2;}else if (ch[p + 1] == '>'){str[0] = ch[p];str[1] = ch[p + 1];str[2] = '\0';addr = 22;printf("%s\t%d\n", str, addr);p = p + 2;}else{str[0] = ch[p];str[1] = '\0';addr = 25;printf("%s\t%d\n", str, addr);p++;}}else if (ch[p] == '>'){if (ch[p + 1] == '=') {str[0] = ch[p];str[1] = ch[p + 1];str[2] = '\0';addr = 24;printf("%s\t%d\n", str, addr);p = p + 2;}else{str[0] = ch[p];str[1] = '\0';addr = 23;printf("%s\t%d\n", str, addr);p++;}}else if (ch[p] == ':'){if (ch[p + 1] == '=') {str[0] = ch[p];str[1] = ch[p + 1];str[2] = '\0';addr = 20;printf("%s\t%d\n", str, addr);p = p + 2;}else{printf("程序有错误,在第%d行!!,“%c”is Error。\n", line,ch[p]);break;}}else if (ch[p] == '+'){addr = 16; str[0] = ch[p]; str[1] = '\0';printf("%s\t%d\n", str, addr);p++;}else if (ch[p] == '-'){addr = 17; str[0] = ch[p]; str[1] = '\0';printf("%s\t%d\n", str, addr);p++;}else if (ch[p] == '*'){addr = 18; str[0] = ch[p]; str[1] = '\0';printf("%s\t%d\n", str, addr);p++;}else if (ch[p] == '/'){addr = 19; str[0] = ch[p]; str[1] = '\0';printf("%s\t%d\n", str, addr);p++;}else if (ch[p] == '='){addr = 21; str[0] = ch[p]; str[1] = '\0';printf("%s\t%d\n", str, addr);p++;}else if (ch[p] == '('){addr = 28; str[0] = ch[p]; str[1] = '\0';printf("%s\t%d\n", str, addr);p++;}else if (ch[p] == ')'){addr = 29; str[0] = ch[p]; str[1] = '\0';printf("%s\t%d\n", str, addr);p++;}else{printf("程序有错误,在第%d行!!,“%c”is Error。\n", line,ch[p]);break;}}
}int main()
{FILE *fp = fopen(path, "r");if (fp == NULL)return 0;printf("路径%s下的文件经词法分析器分析后如下:\n",path);printf("单词    种别编码\n");getsym(fp);fclose(fp);return 0;
}

编译原理实验之词法分析相关推荐

  1. 编译原理实验:词法分析

    编译原理实验:词法分析 1. 实验题目:词法分析 实验目的 实验内容 实验要求 输入输出 2. 设计思想 3.算法流程 4. 源程序 5. 调试数据 1. 实验题目:词法分析 实验目的 根据PL/0语 ...

  2. 编译原理实验一 词法分析程序设计与实现

    一.实验目的 通过编写和调试一个词法分析程序,掌握在对程序设计语言的源程序进行扫描的过程中,将字符流形式的源程序转化为一个由各类单词构成的序列的词法分析方法. 二.基本实验内容与要求 假定一种高级程序 ...

  3. 编译原理实验代码c语言,编译原理实验 简单词法分析(含源代码和实验结果)

    可直接运行 原创!! 附录一 实验报告样式 <编译原理>实验报告 实验2 简单词法分析 姓名 陈婷婷 学号 1009050121 班级 计科1001班 时间: 2012/4/5 地点:文波 ...

  4. 编译原理 实验二 词法分析程序设计

    1. 实验内容 ● TINY语言的词法由TINY Syntax.ppt描述: ● TINY语言的词法分析器由TINY Scanner.rar的C语言代码实现: ● TINY+语言的词法由TINY+ S ...

  5. 编译原理实验c语言cfg文法,编译原理

    地址在符号表中引入指针previous,来连接上一个符号的首地址运行时存储空间组织活动记录用于管理函数变量的信息栈式存储过程进入和返回通过变更top和sp指针,实现活动记录的栈式处理静态链实现局部变量 ...

  6. 词法分析程序的设计(编译原理实验一)

    词法分析程序的设计(编译原理实验一) 一.实验内容 ​ 编制一个能够分析三种整数.标识符.主要运算符和主要关键字的词法分析程序. 二.实验要求 编写程序,识别如下单词符号 标识符 <字母> ...

  7. html解析器编译原理,编译原理实验报告词法分析器(内含源代码).docx

    编译原理实验报告词法分析器(内含源代码) 编译原理实验(一) --词法分析器 实验描述 运行环境:vc++2008 对某特定语言A ,构造其词法规则. 该语言的单词符号包括: 1该程序能识别的单词符号 ...

  8. 编译原理实验:代码生成作业(1)

    编译原理实验4:中间代码生成实验包-C++文档类资源-CSDN下载编译原理实验4:中间代码生成实验包更多下载资源.学习资料请访问CSDN下载频道.https://download.csdn.net/d ...

  9. 编译原理--实验2 语法分析

    文章目录 前言 1.1实验目的 1.2 实验任务 1.3 实验内容 1.3.1 实验要求 1.3.2 输入格式 1.3.3 输出格式 1.3.4 样例 1.4 程序 1.4.1 程序流程图 1.4.2 ...

  10. 编译原理实验二:赋值语句的语法分析程序设计

    编译原理实验二:赋值语句的语法分析程序设计 1.1实验内容 目的: 在前面实验的基础上,通过设计.编制.调试一个典型的赋值语句的语法分析程序,实现对词法分析程序所提供的单词序列进行语法检查,进一步掌握 ...

最新文章

  1. oracle 默认表空间 10g,Oracle10g 表空间管理
  2. OEM, ODM, OBM
  3. 可以获取python整数类型帮助的是什么-Python 的数值类型(整数、长整数、浮点数和复数)...
  4. 1.7 matlab矩阵元素的引用(可通过下标和序号引用)
  5. redis源码剖析(六)—— Redis 数据库、键过期的实现
  6. 惠普ns1005w使用说明_惠普 NS1005w 多功能一体机解析:15秒智能闪充 + 全功能手机操控...
  7. Be动词的缩写形式_3
  8. SQL 2008 表死锁的解决
  9. 创建 JavaScript 对象
  10. 第十二章——SQLServer统计信息(3)——发现过期统计信息并处理
  11. HTMLUnit爬虫模拟登录Linkedin
  12. 跨站脚本攻击(XSS)
  13. php生成微信小程序二维码
  14. SSID、BSSID、ESSID的区别
  15. AP计算机编程路上的照明灯----学校老师哈佛博士的伊利诺伊大学学生如何说
  16. html调用 另存为,:将html另存为文本
  17. 服务器U盘安装虚拟化,用Proxmox ISO镜像制作引导U盘
  18. 一文读懂电磁学发展史[图文版]
  19. 网站图片优化SEO方法有哪些
  20. 北京理工大学2000年复试上机题

热门文章

  1. 软件测试中动态测试与静态测试的区别
  2. vue echarts 地图往下穿透到县
  3. babyion 加载obj模型_如何使用BabylonJS加载OBJ或STL模型
  4. 宇视服务器硬盘序列号,宇视科技云存储服务器
  5. 巴斯勒BASLER GIGE相机程序调试报错后需要拔网线
  6. Xshell_4.0绿色版
  7. 史上最详细Excel制作生命游戏,体验生命演化。
  8. Ubuntu20.04Server双网卡问题
  9. android微信网页视频播放器,关于微信使用内置播放器播放视频的办法
  10. 花西子背后的那个男人和他的五篇笔记