编译原理课内实验报告(词法分析、简单赋值语句的语法分析)

这是笔者在whut选修的编译原理课程的课内实验(含实验报告)
实验内容包含:
(1)词法分析
(2)简单赋值语句的语法分析
温馨提示:本篇博客中的语法Syntax错误拼写成了Synax,请见谅!!

一、实验要求

(1) 完成对C++语言的各类单词的词法分析程序设计。
实际实验时完成了对以下几种单词的分析:
1) 标识符(以字母或下划线开头的连续字符序列)
2)无符号数(包含小数)
3)关键字(如int ,include等)
4)界符(如 ; , 等)
5)运算符(包含复合运算符++,+=等)

(2)对于常用高级语言(如Java、C++语言)的赋值语句用所学过的语法分析方法进行语法分析。
本次实验简化了赋值语句的文法,简化后的文法如下:
文法:
1)<赋值语句>∷= 〈标识符〉 = 〈表达式〉
2) <表达式> ::= <项> <运算符> <项> | <项>
3) <项>::=<因子> <运算符> <因子> |<因子>
4)〈因子〉∷= 〈标志符〉|〈无符号整数〉|(〈表达式〉)
5)〈无符号整数〉∷= 〈数字〉|〈无符号整数〉〈数字〉
6)〈标识符〉∷= 〈字母〉|〈标识符〉〈字母〉|〈标识符〉〈数字〉
7)〈加法运算符〉∷= +|-
8)〈乘法运算符〉∷= *|/

二、运行截图展示

1.词法分析
本次实验从文件input_CStytle.txt文件中读取源程序,经过词法分析后的得到的结果以二元式的形式 <单词类型,单词值>。
其中单词类型包括:关键字keyword,界符boundary,运算符operator,数字digit,标识符token;单词值特殊说明:空格space,水平制表符tab,换行enter。
在这里插入图片描述
在这里插入图片描述
(2)语法分析
1)识别的赋值语句正确:variable_name+=str+cha4;
在这里插入图片描述
2)没有赋值符号的情况:variable_name+str+cha
4;
在这里插入图片描述

三、代码说明

1.项目结构
在这里插入图片描述
2.文件说明
ApplicationEntrance:程序入口
Controller:词法分析总控程序
Analysis:词法分析子程序
SynaxAnalysis:语法分析子程序(递归下降法)
OutputAction:输出相关操作
InputAction:输入相关操作
Constants:常量文件

3.输入文件等
在这里插入图片描述
boundary_CStytle:界符文件
keywords_CStytle:关键字文件
operator_CStytle:操作符文件
input_CStytle:源程序输入文件
output_CStytle:输出文件
input_sentence:语法分析的赋值语句文件

上述文本文件可以根据自身需求自行定义

四、词法分析源程序

ApplicationEntrance:

/*
* @author W-nut
* FileInfo:应用程序入口
*/

#include <iostream>
#include "Controller.h"
#include "SynaxAnalysis.h"
#include "InputAction.h"
#include "OutputAction.h"
using namespace std;

int main()
{
   
	//词法分析
	InputCode();//输入源程序
	InputKOB();//输入关键字、运算符、界符
	cout << "这是C语言的词法分析程序!" << endl;
	Controller();
	OuptutWord();
	OutputWordToFile();

	//语法分析
	code_vector.clear();
	word_vector.clear();
	InputSentence();
	Controller();
	OuptutWord();
	SynaxAnalysis();
	return 0;
}

Controller:

/*
 * @authot W-nut
 * FileInfo:词法分析总控程序
 */

#include <iostream>
#include "Analysis.h"
#include "Constants.h"

using namespace std;

//分析当前字符属于哪一类
int Distribute(const char ch);
bool IsOpreator(const string word);


//函数说明:总控程序
void Controller()
{
   
	for (int begin=0;begin<code_vector.size();)
	{
   
		string word="";
		int end = begin + 1;
		int type = Distribute(code_vector[begin]);
		
		word += code_vector[begin];
		if (type == LETTER)
		{
   
			for (; end < code_vector.size(); ++end)
			{
   
				if (Distribute(code_vector[end]) != BOUNDARY && Distribute(code_vector[end]) != OPERATOR)
				{
   
					word += code_vector[end];
				}
				else
				{
   
					break;
				}
			}
			LetterAnalysis(word);//标识符或关键字
		}
		else if (type == DIGIT)
		{
   
			for (; end < code_vector.size(); ++end)
			{
   
				//bool sign = true;
				if (Distribute(code_vector[end]) == DIGIT)
				{
   
					word += code_vector[end];
				}
				else if (code_vector[end] == '.')
				//else if (code_vector[end] == '.' && sign) 
				{
   
					word += code_vector[end];
					//!sign;
				}
				else
				{
   
					break;
				}
			}
			DigitAnalysis(word);//无符号数
		}
		else if (type == BOUNDARY)
		{
   
			BoundaryAnalysis(word);
		}
		else
		{
   
			for (; end < code_vector.size(); ++end)
			{
   
				if (Distribute(code_vector[end]) != DIGIT && Distribute(code_vector[end]) != LETTER && Distribute(code_vector[end]) != BOUNDARY)
				{
   
					if (code_ve
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值