编译原理课程设计说明书

更新时间: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

本文来源:https://www.bwwdw.com/article/6jbx.html

Top