编译原理课程设计说明书
更新时间:2024-01-04 07:36:01 阅读量: 教育文库 文档下载
山东科技大学学生课程设计
课 程 设 计 说 明 书
设计题目: 词法分析程序设计
专 业: 计算机科学与技术 班级:
设 计 人:
山 东 科 技 大 学
2014年 6 月 1 日
山东科技大学学生课程设计
课 程 设 计 任 务 书
学院 信息科学与工程学院 专业 计算机科学与技术 班级 姓名
一、课程设计题目: 词法分析程序设计
二、课程设计主要参考资料
(1)韩太鲁等, 编译原理. 石油大学出版社.2007.9
(2)邵顺增、李琳, C#程序设计. 2008.8
(3) lex-yacc使用说明 . PPT (4) window_bison_flex使用举例 . PDF 三、课程设计应解决的主要问题:
(1) 设计编写词法分析程序 (2) 学会使用Lex软件进行词法分析 (3) (4) 四、课程设计相关附件(如:图纸、软件等):
(1) 词法分析器.exe (2) 源代码 (3) 五、任务发出日期: 2014-3-5 课程设计完成日期: 2014-6-5
指导教师签字: 系主任签字:
山东科技大学学生课程设计
指导教师对课程设计的评语
成绩:
指导教师签字:
年 月 日
山东科技大学学生课程设计
目录
实验一 词法分析程序............................................1 一 、设计目的 ..............................................1 二、设计要求................................................1 三、设计说明................................................1 四、运行结果及分析.........................................13 五、总结...................................................15 实验二 Lex词法分析..........................................16 一 、实验目的 .............................................16 二、实验要求...............................................16 三、实验说明...............................................16 四、运行结果...............................................16 五、总结...................................................17
山东科技大学学生课程设计
实验一 词法分析程序
一、设计目的
通过设计编制调试一个具体的词法分析程序,加深对词法分析原理的理解。并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法。
二、设计要求
编制一个读单词过程,从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分隔符五大类。 并依次输出各个单词的内部编码及单词符号自身值。
(遇到错误时可显示“Error”,然后跳过错误部分继续显示)
三、设计说明
a)需求分析(程序任务)
? 输入:源程序(保留字,标识符,数字,运算符,分隔符,以及
错误字符) ? 输出格式:(“单词所属类别别”,“单词”)
其中:
类别1 (保留字):
\\\\类别2(标识符):除保留字外的其他字母开头的单词 类别3(数字):无符号整型或浮点型 类别4(运算符):+、-、*、/、>、>=、<、<=、==、!= 类别5(分隔符): ,、;、(、)、{、} 类别6(错误字符):其他不能识别的单词
1
山东科技大学学生课程设计
正规式和状态转换图:
b)概要设计
① 建立保存编译结果的类:
class Result {
public int style; public string word;
public void init(int s, string w) {
style = s; //单词所属类别 word = w; //单词 } }
② 主程序流程:
2
山东科技大学学生课程设计
c)详细设计(主要模块流程图及算法) ①预处理模块:
流程图:
3
山东科技大学学生课程设计
算法:
private string Pretreatment() {
//去除//注释
for (int i = 0; i < str.Length; i++) {
if (str[i].Contains(\ //判断str[i]中是否存在“//”
{
//将字符串str[i]中‘/’之后内容去掉 string[] strr = str[i].Split('/'); str[i] = strr[0]; } }
4
山东科技大学学生课程设计
//去除换行,将所有输入字符存入一个字符串st1 for (int i = 0; i < str.Length; i++) str1 += str[i] + \ //去除跳格,回车
if (str1.Contains(\ //垂直制表符 str1 = str1.Replace(\ if (str1.Contains(\ //换行 str1 = str1.Replace(\ if (str1.Contains(\ //换行 str1 = str1.Replace(\ if (str1.Contains(\ //制表符 str1 = str1.Replace(\ //去除注释
while (str1.Contains(\ {
str1=str1.Remove(str1.IndexOf(\str1.IndexOf(\
}
//去除多余空格
while (str1.Contains(\ \ {
str1 = str1.Replace(\ \ }
return str1; }
②分析编译模块:
采用超前搜索方法。即,分析当前字符时,超前读入一个字符,
以判断当前字符串是否结束。
流程图:
5
山东科技大学学生课程设计
主要代码:
6
山东科技大学学生课程设计
private void Analysis_button_Click(object sender, EventArgs e) {
Output_textBox.Text = null;
string program = Pretreatment(Input_textBox.Text); int i;//循环program
Result[] im = new Result[100]; int x;
for (x = 0; x < 100; x++) {
im[x] = new Result(); }
int j=0;//循环im i = 0;
while(i if (isornotchar(program[i]))//第一个是字母 { int flag = 1;//正确的标识符 im[j].word += Convert.ToString(program[i]); if (i < program.Length-1) { i++; while (program[i] != ' ' && program[i] != '\\r' && program[i] != ',' && program[i] != ';' && program[i] != '+' && program[i] != '-' && program[i] != '*' && program[i] != '/' && program[i] != '<' && program[i] != '>' && program[i] != '=' && program[i] != '!' && program[i] != '(' && program[i] != ')' && program[i] != '[' && program[i] != ']' && program[i] != '{' && program[i] != '}') { if (!(isornotchar(program[i])) && !(isornotnum(program[i]))) flag = 0; im[j].word += Convert.ToString(program[i]); if (i < program.Length - 1) i++; 7 山东科技大学学生课程设计 else { i++; break; //到了程序的结束 } } } else //是标志符 { im[j].word = Convert.ToString(program[i]); im[j].style = 2; i++; } /*******************保留字*************************/ if (im[j].word == \ im[j].word == \im[j].word == \ im[j].word == \ im[j].word == \im[j].word == \ im[j].word == \ im[j].word == \im[j].word == \ im[j].word == \ \\\\\ im[j].style = 1; else im[j].style = 1; if (flag == 0) im[j].word += program[i]; j++; } else if (isornotnum(program[i]))//第一个是数字 { int location = 0; //记录小数点的位置 8 山东科技大学学生课程设计 char style = ' '; //初始状态为整数 string word = null; word += Convert.ToString(program[i]); if (i < program.Length - 1) { i++; location++; while (isornotnum(program[i]) | program[i] == '.' ) { location++; if(program[i]=='.') { style='.'; } word += Convert.ToString(program[i]); if (i < program.Length - 1) i++; else { i++; break; } } } else { //im[j].style = 3; im[j].style = 1; } if (style == ' ')//整数 { int num = Convert.ToInt32(word); im[j].word = num.ToString(); } else //小数 {//location对应点的位置 //确定location的位置 int n ; for (n = 0; n < word.Length; n++) 9 山东科技大学学生课程设计 { if (word[n] == '.') location = n; } string left = null; string right = \ int m;//用于循环 for (m = 0; m < word.Length; m++) { if (m < location) left += word[m]; else right += word[m]; } im[j].word += Convert.ToString('.'); im[j].word += Convert.ToInt16(left); im[j].word += Convert.ToDouble(right); } //im[j].style = 3; im[j].style = 1; j++; } /**********************运算符*********************/ else if (program[i] == '>' || program[i] == '<' || program[i] == '!' || program[i] == '=') { if (i < program.Length - 1)//存在i+1 { if (program[i + 1] == '=') { if (j == 0) { im[0].word = program[i] + \ im[0].style = 4; i += 2; j++; } else { 10 山东科技大学学生课程设计 j++; im[j].word = program[i] + \ im[j].style = 4; j++; i += 2; } } else { if (j == 0) { im[0].word = program[i]; im[0].style = 4; i++; j++; } else { j++; im[j].word = program[i]; im[j].style = 4; j++; i++; } } } else { if (j == 0) { im[0].word = program[i]; im[0].style = 4; i++; j++; } else { j++; 11 山东科技大学学生课程设计 im[j].word = program[i]; im[j].style = 4; j++; i++; } } } else if (program[i] == '+' || program[i] == '-' || program[i] == '/'||program[i] == '/' || program[i] == '=' ) { if (j == 0) { im[0].word = program[i]; im[0].style = 4; i++; j++; } else { j++; im[j].word = program[i]; im[j].style = 4; j++; i++; } } /***********************分隔符****************/ else if (program[i] == ';' || program[i] == ',' || program[i] == '(' || program[i] == ')' || program[i] == '{'||program[i] == '}'||program[i] == '['||program[i] == '[') { if (j == 0) { im[0].word = program[i]; im[0].style = 5; i++; 12 山东科技大学学生课程设计 j++; } else { j++; im[j].word = program[i]; im[j].style = 5; j++; i++; } } }//endwhile //输出 #region for (j = 0; j < 100; j++) { if (im[j].word != null && im[j].word!=\ { Output_textBox.Text += \ Output_textBox.Text += im[j].style; Output_textBox.Text += \ Output_textBox.Text += \ Output_textBox.Text += im[j].word; Output_textBox.Text += \ Output_textBox.Text += \ Output_textBox.Text += \ } } } #endregion 四、运行结果及分析 13 山东科技大学学生课程设计 程序界面: 运行结果: 14 山东科技大学学生课程设计 五、总结 通过这次实验,我对编译原理这门专业必修课有了进一步的深层次了解,把理论知识应用于实验中,也让我熟悉了C#语言的相关内容,加深了对C#语言知识的深化和用途的理解。相信在以后的学习工作中会有更大的提升。 15 山东科技大学学生课程设计 实验二 Lex词法分析 一、实验目的 通过编写并上机调试一个词法分析程序,掌握在对程序设计语言的源程序进行扫描的过程中,将其分解成各类单词的词法分析方法。 二、实验要求 要求将用模拟语言书写的源程序进行词法分析,输出源程序清单,Token文件和错误信息文件,若有错误,必须输出错误在源程序中行号和列号,并将符号表和字符串以文件的形式写出来。 三、实验步骤 1、按照lex-yacc使用说明安装并配置相关软件(bison和flex安装在C:/test目录下); 2、在C:/test目录下建立a.c文件,并用文本编辑器输入源程序; 3、将cmd切换到C:/test目录下,运行bison,生成lex.yy.c文件; 4、用codeBlocks打开lex.yy.c文件,创建并运行,得出结果。 四、运行结果 1、运行bison,生成lex.yy.c文件: 16 山东科技大学学生课程设计 2、用codeBlocks运行lex.yy.c: 源程序为: void main() { int a, b; a = 10; b = a + 20; printf(\ } 五、总结 通过本次实验,使我对lex工具的具体使用有了一定的了解,熟悉了parser generator工具环境变量的配置,明白了lex里的三个部分的具体功能,了解了怎么在lex工具里定义正则表达式,对正则表达式的了解进一步加深,在实验的同时,增强了自己的动手能力。 17 山东科技大学学生课程设计 2、用codeBlocks运行lex.yy.c: 源程序为: void main() { int a, b; a = 10; b = a + 20; printf(\ } 五、总结 通过本次实验,使我对lex工具的具体使用有了一定的了解,熟悉了parser generator工具环境变量的配置,明白了lex里的三个部分的具体功能,了解了怎么在lex工具里定义正则表达式,对正则表达式的了解进一步加深,在实验的同时,增强了自己的动手能力。 17
正在阅读:
编译原理课程设计说明书01-04
不平凡的美05-16
教训,关于教训的作文02-04
如何写大学活动策划书(大学策划书格式及实例修订版)03-19
UNIX系统常用命令05-12
出纳工作总结与计划09-28
公路项目初步设计总说明 - 图文03-15
设计美学靳埭强作品赏析06-09
毛概选择04-09
- exercise2
- 铅锌矿详查地质设计 - 图文
- 厨余垃圾、餐厨垃圾堆肥系统设计方案
- 陈明珠开题报告
- 化工原理精选例题
- 政府形象宣传册营销案例
- 小学一至三年级语文阅读专项练习题
- 2014.民诉 期末考试 复习题
- 巅峰智业 - 做好顶层设计对建设城市的重要意义
- (三起)冀教版三年级英语上册Unit4 Lesson24练习题及答案
- 2017年实心轮胎现状及发展趋势分析(目录)
- 基于GIS的农用地定级技术研究定稿
- 2017-2022年中国医疗保健市场调查与市场前景预测报告(目录) - 图文
- 作业
- OFDM技术仿真(MATLAB代码) - 图文
- Android工程师笔试题及答案
- 生命密码联合密码
- 空间地上权若干法律问题探究
- 江苏学业水平测试《机械基础》模拟试题
- 选课走班实施方案
- 编译
- 说明书
- 原理
- 课程
- 设计
- 微机原理实验报告
- 从西方社会学产生看社会学学科性质
- 2019最新苏少版音乐六下《歌声与微笑》教案1
- 我国对外建筑工程造价费用的组成形式及其分摊比例
- 任职要求和职责 - 图文
- 江苏省2019中考英语预测试卷(含答案)
- 2015高考真题 解析版 - 英语陕西卷
- 耳鼻咽喉11个临床路径
- 第六课 做情绪的主人- 首页- 天河部落
- 漫谈党史人物
- (苏教版)三年级数学上册《认识千克》教案设计
- 真诚化坚冰真功赢人心――企业军转干部解困维稳工作情况报告-推荐下载
- 2016浙大远程 工程概预算在线作业正确答案
- 2018-2019年高中地理知识点《地球与地图》《地球》《地球仪,经纬网及其地理意义》单元测试试卷
- 蒋庄煤矿瓦斯地质规律与瓦斯涌出浅析
- 2015年秋季学前教育工作计划
- 青霉素课程设计
- 雕庄中心小学“ 小种植”校本课程实施纲要
- 化学教学论
- 山西省阳泉市、大同市、晋中市2010届高三三校联考(数学理)