| 课 程 设 计 说 明 书 |
|
| 课程设计名称 |
语言与编译器设计课程设计 |
| 专 业 |
|
| 班 级 |
|
| 学生姓名 |
|
| 指导教师 |
|
2023 年 5 月 18 日
| 课 程 设 计 任 务 书 |
|||
| 课程设计题目 |
词法分析、语法分析、语义分析及中间代码生成程序的设计 |
||
| 起止日期 |
2023年 5月 22 日— 2023 年5月26 日 |
设计地点 |
|
| 设计任务及日程安排: 设计任务:
说明:第1、4题每位同学必须完成,第2、3题任选其一即可。 日程安排: 本次设计共一周时间,日程安排如下: 第1天:设计词法分析程序,并进行功能扩充,编写设计报告; 第2-3天:设计表达式的语法分析程序,并进行功能扩充,编写设计报告; 第4天:设计表达式的中间代码生成程序,并进行功能扩充,编写设计报告; 第5天:程序验收,答辩。 设计报告要求: 1. 每个题目编写一份设计报告,每位同学独立完成。 2. 针对每个题目给出算法描述,源代码,程序运行结果及结果分析。 设计环境: 操作系统:windows |
|||
注:此任务书由指导教师在课程设计前填写,发给学生作为本门课程设计的依据。
设计题目一 词法分析器的设计
1.主要数据结构
string KEYWORD[8]={}; //枚举关键字类型
char SEPARATER[6]={}; //枚举分隔符
char OPERATOR[5]={}; //枚举运算符
char ROPERATOR[6]={};//枚举关系运算符
char FILTER[4]={}; //枚举过滤符
const int KEYW=1; //保存关键字的种别编码1
const int SEPA=2;//保存分隔符的种别编码2
const int OP=3;//保存运算符的种别编码3
const int ROP=4; //保存关系运算符的种别编码4
const int IDENTIFIER=5; //保存标识符的种别编码5
const int CONSTANT=6; //保存常数值的种别编码6
2.算法描述
IF输入合法,进行词法分析analyse(fpin);
读入一个字符 //用“ch”表示当前读入字符
调用函数IsFilter()判断是否为过滤符
IF是过滤符,跳过; //' ','\t','\r','\n'
ELSE IF是注释
{
ch=fgetc(fpin)读入下一个字符
IF下一个字符ch=='*'
WHILE (ch!='/'&&chLast!='*')//结合指针fpin与while循环实现对注释的跳过
{
chLast=ch;
ch=fgetc(fpin);
}
}
ELSE
文件指针后退一个字节
输出该字符是除法运算符
ELSE IF是字母
{
WHILE字符属于字母
继续往下读入字符,以字符串类型并存入arr中
UNTIL字符不属于字母
文件指针回退一个字节
调用函数IsKeyword(arr)
判断得到的字符串是否为保留关键字
IF是关键字
输出关键字相应内容
ELSE IF不是关键字
必然是标识符,输出相应内容;
}
ELSE IF是整型数
输出整型数相应内容;
IF是字母或“_”加数字的组合
输出标识符相应内容;
ELSE 调用switch(ch)函数
通过比对来实现判断分隔符和运算符;
IF以上均不满足就看作无法分析,输出相应结果。
1.超前搜索方法fseek(fpin,-1L,SEEK_CUR)
文件指针后退一个字节;
2.全局变量声明部分:
主要是定义了存储关键字、分隔符、运算符和几个全局的常量,方便后面判断的时候直接使用。
3.判断是否为关键字函数bool IsKeyword(string word)
通过传入参数的字符串,进行有限次遍历与全局变量的关键字二维数组进行比对,从而判断是否为关键字;
4.判断是否为分隔符bool IsSeparater(char ch):
通过传入参数的字符,进行有限次遍历与全局变量的分隔符数组进行比对,从而判断是否为分隔符;
5.判断是否为运算符bool IsOperator(char ch)
通过传入参数的字符,进行有限次遍历与全局变量的运算符数组进行比对,从而判断是否为分隔符;
6.判断是否为关系运算符bool IsROperator(char ch)
通过传入参数的字符,进行有限次遍历与全局变量的关系运算符数组进行比对,从而判断是否为关系运算符;
7.判断是否为过滤符bool IsFilter(char ch)
通过传入参数的字符,进行有限次遍历与全局变量的过滤符数组进行比对,从而判断是否为过滤符;
8.判断是否为字母bool IsLetter(char ch)
判断传入的参数是否大写字母或者小写字母;
9.判断是否为数字 bool IsDigit(char ch)
判断传入的参数是否为数字;
10.词法分析void analyse(FILE * fpin)
词法分析函数void analyse(FILE * fpin):
传入的参数是指针变量 fpin。
首先声明一个字符变量和字符串变量,用来暂存进行分析的字符或字符串;
将输入文件的内容提取出来,通过ch=fgetc(fpin),对字符进行赋值,这样就可以通过不断循环一步一步进行分析了。
11.主函数:int main()
主函数主要就是通过声明一个函数指针fpin,用这个文件指针以“r”只读方式打开“inFile”这个文件。调用函数analyse(fpin);这里传入的参数就是通过只读方式打开的文件内容。然后将分析的结果显示在屏幕上。
3.源程序
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
using namespace std;
string KEYWORD[8]={"if","int","for","while","do","return","break","continue"}; //关键字
char SEPARATER[6]={',',';','{','}','(',')'}; //分隔符
char OPERATOR[5]={'+','-','*','/','='}; //运算符
char ROPERATOR[6]={'>','<','>=','<=','==','!='};//关系运算符
char FILTER[4]={' ','\t','\r','\n'}; //过滤符
const int KEYW=1; //关键字 种别编码1
const int SEPA=2;//分隔符 种别编码2
const int OP=3;//运算符 种别编码3
const int ROP=4; //关系运算符 种别编码4
const int IDENTIFIER=5; //标识符 种别编码5
const int CONSTANT=6;

本文详细介绍了编程语言与编译器设计的课程设计,包括词法分析器、递归下降法进行表达式分析和算术表达式的逆波兰表示与计算。涵盖了数据结构、算法描述、源程序分析及功能扩展,如注释跳过、错误处理和实数处理等。
最低0.47元/天 解锁文章
1235

被折叠的 条评论
为什么被折叠?



