语言与编译器设计课程设计-词法分析、语法分析、语义分析及中间代码生成程序的设计

本文详细介绍了编程语言与编译器设计的课程设计,包括词法分析器、递归下降法进行表达式分析和算术表达式的逆波兰表示与计算。涵盖了数据结构、算法描述、源程序分析及功能扩展,如注释跳过、错误处理和实数处理等。
摘要由CSDN通过智能技术生成

课 程 设 计 说 明 书

课程设计名称

  语言与编译器设计课程设计

专        业

                           

班        级

                           

学生姓

                           

指导教

                           

   2023 年 5 月 18 日

课 程 设 计 任 务 书

课程设计题目

词法分析、语法分析、语义分析及中间代码生成程序的设计

起止日期

2023年 5月 22 日 2023 年5月26 日

设计地点

设计任务及日程安排:

设计任务:

  1. 设计词法分析程序,并进行功能扩充;
  2. 采用递归下降分析法设计表达式的语法分析程序,并进行功能扩充;
  3. 采用预测分析法设计表达式的语法分析程序,并进行功能扩充;
  4. 设计表达式的中间代码生成程序,并进行功能扩充。

说明:第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;   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

青竹小轩_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值
>