编译原理课设代码-2

编译原理课设(NEU) exe1.cpp

代码有几处bug,另外当时开发的时候心太急,理论基础没有做好,导致代码有不可逆性的缺陷:符号表,大家可以将符号表结构修改一下
代码是分为多个文章中存放的
VS 2017 VC++环境
代码是分为6个部分,在个人主页中都可以找到

#include "pch.h"
#include "exe1.h"
#include<fstream>
#include <iostream>
#include<map>
#include<string>
#include<stdlib.h>
#include<stdio.h>
#include<cstring>
#include<list>
exe1::exe1(string txt_name)
{	
	Map_KT = init_KT(Map_KT);
	Map_PT = init_PT(Map_PT);
	char ch;
	char Token_before[20];
	int i = 0;
	int state = 1, state_before = 0;
	//FILE *fstream;
	fstream read_file;
	read_file.open("D:\\VS_code\\编译课程设计\\exe1.txt");
	read_file >> noskipws;
	

	if (read_file.eof())
	{
		printf("read file test1.txt failed!\n");
		exit(1);
	}
	while (!read_file.eof())
	{
		read_file >> ch;
		if (read_file.fail())
			break;
		state_before = state;
		state = state_change(state, ch);

		if (state == -1)
		{
			cout << "输入源程序有误!" << endl;
			exit(0);
		}
		if (state)
		{
			Token_before[i++] = ch;
		}
		else
		{

			int ch_code;
			ch_code = ch_to_code(ch);
			char * Token=new char[i + 1];
			for (int j = 0; j < i; j++)
				Token[j] = Token_before[j];
			Token[i] = '\0';
			string out_token(Token);
			Out_Token(state_before, out_token, ch_code, ch);
			if ((ch_code == 0) || (ch_code == 3))//恢复初始状态
			{
				i = 0;
				state = 1;
			}
			else {//获得之前的状态
				Token_before[0] = ch;
				i = 1;
				state = state_change(1, ch);
			}
		}

	}
	list<string>::iterator j = leixing.begin();
	list<string>::iterator k = neibuma.begin();
	list<int>::iterator l = jiao.begin();
	for (list<string>::iterator i = daima.begin(); i != daima.end() && j != leixing.end() && k != neibuma.end() && l != jiao.end(); i++, j++, k++, l++)
	{
		cout << (*i) << " " << (*j) << " " << (*k) << " " << (*l) << endl;
	}
	transfer(daima);
}


exe1::~exe1()
{
}



using namespace std;
//首先利用map类创建两个表,分别为关键字表和界符表
map<string, string> exe1::init_KT(map<string, string> map_kt) {
	map_kt.insert(pair<string, string>("int", "01"));//利用pair类插入数据
	map_kt.insert(pair<string, string>("main", "02"));
	map_kt.insert(pair<string, string>("void", "03"));
	map_kt.insert(pair<string, string>("if", "04"));
	map_kt.insert(pair<string, string>("else", "05"));
	map_kt.insert(pair<string, string>("while", "06"));
	map_kt.insert(pair<string, string>("return", "07"));
	map_kt.insert(pair<string, string>("Function", "08"));
	map_kt.insert(pair<string, string>("Type", "09"));
	map_kt.insert(pair<string, string>("struct", "10"));
	return map_kt;
}//关键字表
map<string, string> exe1::init_PT(map<string, string> map_pt) {
	map_pt.insert(pair<string, string>(">=", "11"));
	map_pt.insert(pair<string, string>("<=", "12"));
	map_pt.insert(pair<string, string>("==", "13"));
	map_pt.insert(pair<string, string>("=", "14"));
	map_pt.insert(pair<string, string>(">", "15"));
	map_pt.insert(pair<string, string>("<", "16"));
	map_pt.insert(pair<string, string>("+", "17"));
	map_pt.insert(pair<string, string>("-", "18"));
	map_pt.insert(pair<string, string>("*", "19"));
	map_pt.insert(pair<string, string>("/", "20"));
	map_pt.insert(pair<string, string>(".", "21"));
	map_pt.insert(pair<string, string>("{", "22"));
	map_pt.insert(pair<string, string>("}", "23"));
	map_pt.insert(pair<string, string>(",", "24"));
	map_pt.insert(pair<string, string>(";", "25"));
	map_pt.insert(pair<string, string>("(", "26"));
	map_pt.insert(pair<string, string>(")", "27"));
	map_pt.insert(pair<string, string>("|", "28"));
	map_pt.insert(pair<string, string>("&", "29"));
	return map_pt;
}//界符表

int exe1::ch_to_code(char ch) {//将每个字符转换成自动机可以识别的类别码
	if ((ch >= 'a'&&ch <= 'z') || (ch >= 'A'&&ch <= 'Z'))//关键字和标识符,后续继续识别
		return 1;
	else if (ch >= '0'&&ch <= '9')//常量
		return 2;
	else if (ch == ' ' || ch == '\t' || ch == '\n')
		return 0;
	else if (ch == '%' || ch == '#')//避免出现不予许字符///
		return -1;
	else
		return 3;
}

int exe1::state_next(int state, int ch_code) {//根据分析,创建确定性的状态转换自动机
	if (ch_code == 0)
		return 0;
	switch (state)
	{
	case 1:
		switch (ch_code)
		{
		case 1:
			return 2;
		case 2:
			return 3;
		default:
			return 0;
		}
	case 2:
		if (ch_code == 1 || ch_code == 2)
			return 2;
		else if (ch_code == -1)
			return -1;//标识符和关键字的组成元素问题
		else
			return 0;
	case 3:
		if (ch_code == 2)
			return 3;
		else if (ch_code == 1)
			return -1;//数字之后出现字母报错!
		else
			return 0;
	}

}

int exe1::state_change(int state, char ch)
{
	int ch_code;
	ch_code = ch_to_code(ch);
	return state_next(state, ch_code);
}

int exe1::Out_Token(int state_before, string out_token, int ch_code, char ch)
{//根据自动机状态及当前字符输出对应TOKEN串
	switch (state_before)
	{
	case 1:
		//过滤掉空格、制表符、换行符
		break;
	case 2:
		if (Map_KT.find(out_token) != Map_KT.end())
		{
			daima.push_back(out_token);
			leixing.push_back("kt");
			neibuma.push_back(Map_KT[out_token]);
			jiao.push_back(ktt);
			ktt++;
			break;
		}
		else
		{
			daima.push_back(out_token);
			leixing.push_back("biao");
			neibuma.push_back("00");
			jiao.push_back(biao);
			biao++;
			break;
		}
	case 3:
	{
		
		daima.push_back(out_token);
		const_number.push_back(out_token);
		leixing.push_back("chang");
		neibuma.push_back("03");
		jiao.push_back(chang);
		chang++;
		break;
	}
	}

	if (ch_code == 3)
	{
		char pt[2];
		pt[1] = '\0';
		pt[0] = ch;
		if (Map_PT.find(pt) != Map_PT.end())
		{
			daima.push_back(pt);
			leixing.push_back("pt");
			neibuma.push_back(Map_PT[out_token]);
			jiao.push_back(ptt);
			ptt++;
		}
	}

}

void exe1::transfer(list<string> source)
{
	list<string>::iterator l_i= source.begin();
	for (; l_i != source.end(); l_i++)
	{
		to_next_output.push_back((*l_i));
	}
}


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值