新建 文本文档.txt

来自「扫描器设计(4学时) 1.实验目的 熟悉并实现一个扫描器。 2.实验类型 」· 文本 代码 · 共 298 行

TXT
298
字号
#include <iostream>
#include <fstream>
#include <string>
#include <cmath>
#include <vector>
//#include <assure>

using namespace std;


	int aut[10][7]={ 2, 15, 15, 15, 8, 9, 15,
                       2, 3, 5,11, 11, 11, 11,
                       4, 0, 0, 0, 0, 0, 0,
                       4, 11, 5,11, 11, 11, 11,
                       7, 0, 0, 6, 0, 0, 0,
                       7, 0, 0, 0, 0, 0, 0,
                       7, 11, 11,11, 11, 11, 11,
                       8, 12, 12, 12, 8, 12, 12,
                       14, 14, 14, 14, 14, 10, 14,
					   13, 13, 13, 13, 13, 13, 13};


	string borderwords[15]={";", ":", "(", ")", ",", ":=", "+", "-", "*", "/",
					  ">", ">=", "==", "<", "<="};
	string keywords[13] = {"program","begin","end","var","while","do",
						"repeat","until","for","to","if","then","else"};
	vector<string> ID;//标识符表
    vector<float> C;//常数表
	bool flag = false;
	struct token
             { int code;
               int value;}token;            //Token结构
    struct token tok[100];      //Token数组
    int s;              //当前状态
    int n,p,m,e,t;     //尾数值,指数值,小数位数,指数符号,类型
    float num;         //常数值
	char w[50];      //源程序缓冲区
	int i;
	int codes = 0;
	string strToken = "";

	int Reserve(string strToken)
	{
		int r_i = 0;
		int flag_str = 0;
		for(r_i = 0; r_i < 15; r_i++ )
		{
			if(strToken == borderwords[r_i])
			{
				flag_str = 1;
			}
			if(flag_str == 1)
			{
				return 3;
			}
				
		}
		
		for(r_i = 0; r_i < 13; r_i++ )
		{
			if(strToken == keywords[r_i])
			{
				flag_str = 2;
			}	
			if(flag_str == 2)
			{
				return 4;
			}
		}
		if(flag_str == 1)
			{
				return 3;
			}
		else if(flag_str == 2)
			{
				return 4;
			}
		else 
			return 0;
	}
	int InsertConst(float number)
	{
		bool c_flag = false;
		for(int c_i = 0; c_i < C.size(); c_i++)
		{
			if(number == C[c_i])
			{
				c_flag = true; 
				break;
			}
				
		}
		if(c_flag == true)
			return c_i;
		else
		{
			C.push_back(number);
			return C.size();
		}	
	}

	int InsertID(string strToken)
	{
		bool id_flag = false;
		for(int id_i = 0; id_i < ID.size(); id_i++)
		{
			if(strToken == ID[id_i])
			{
				id_flag = true;
				break;
			}
				
		}
		if(id_flag == true)
			return id_i;
		else
		{
			ID.push_back(strToken);
			return ID.size();
		}
		
	}
	void acts(int temp)
	{
		switch(temp)
		{
			case 1:            //其它变量初始化;
				n=m=p=t=0;
				e = 1;
				num = 0;
				break;
			case 2:
				n = 10 * n + (w[i] - '0');
				break;
			case 3:
				t = 1;
				break;
			case 4:
				n = 10 *n + (w[i] - '0');
				m++;
				break;
			case 5:
				t = 1;
				break;
			case 6:
				if(w[i] == '-')
					e = -1;
				break;
			case 7:
				p = 10 * p + (w[i] - '0');
				break;
			case 8:
				strToken += w[i];
				break;
			case 9:
				strToken += w[i];
				break;
			case 10:
				strToken += w[i];
				break;
			case 11:
				num = n * pow(10,e*p-m);//计算常数值
				tok[i].code = 2;			//生成常数Token
				tok[i].value = InsertConst(num);
				break;
			case 12:
				codes = Reserve(strToken);//查关键字表 
				if(codes == 4)
				{
					tok[i].code = codes; //生成关键字Token
					tok[i].value = 0;
				}
				else					 //生成标识符Token
				{
					tok[i].code = 1;  
					tok[i].value = InsertID(strToken);
				}
				break;
			case 13:
				codes = Reserve(strToken);  //查界符表
				if(codes == 4)						//生成关键字Token 4
				{
					 tok[i].code = codes; 
					 tok[i].value = 0; //????????????????????????????
				}
				else							 //生成界符Token
				{
//					strToken[strlen(strToken)-1] = '\0';   //单界符源程序缓冲区指针减1;
//					codes = Reserve(strToken);         //查界符表
					tok[i].code = codes; 
					tok[i].value = 0;   //生成界符Token????????????????????????????
				}
				break;
			case 14:
				codes = Reserve(strToken);         //查界符表
				tok[i].code = codes; 
				tok[i].value = 0;       //生成界符Token
				break;
//			case 15:
				
			default:
				break;
		}
		
		
	}

	int find(int s_temp, char w_temp)
	{
		
		if(w_temp >= '0' && w_temp <= '9')
			return aut[s_temp-1][0];
		else if(w_temp == '.')
			return aut[s_temp-1][1];
		else if(w_temp >= 'a' && w_temp <= 'z' || w_temp >= 'A' && w_temp <= 'Z')
			return aut[s_temp-1][4];
		else if(w_temp == ';' ||w_temp == ',' ||w_temp == ':' ||w_temp == '(' ||
				w_temp == ')' ||w_temp == ':=' ||w_temp == '+' ||w_temp == '-' ||
				w_temp == '*' ||w_temp == '/' ||w_temp == '>' ||w_temp == '>=' ||
				w_temp == '<' ||w_temp == '<=' ||w_temp == '=')
			return aut[s_temp-1][5];
		else if(w_temp == '+' || w_temp == '-')
			return aut[s_temp-1][3];
		else if(w_temp == 'E' || w_temp == 'e')
			return aut[s_temp-1][2];
		else //if(w_temp == '-1')
			return aut[s_temp-1][6];
//		else
//			return 0;
	}

void main()
{

            //源程序指针,当前字符为w[i]

	ifstream infile("input_file.txt");

	if(!infile.good())
	{
		cerr << "error : can not open this file " << endl;
	}

	while(!infile.eof())
	{
		
		
		infile.getline(w,50);
		i = 0;

		do
		{
			while(true)
			{
				if(w[i] == ' ')
				{
					i++;
				}
				else
					break;
			}

			strToken = "";
			i--;
			s = 1;

			while(s != 0)
			{
				acts(s);

				if(s >=11 && s <= 14)
					break;
				i++;

				s = find(s,w[i]);
			}

			if(s == 0)
			{
				//词法错误;
			}	
		}while(w[i] != '\0');
	}

	infile.close();
//	 assure(outfile,"input_file");

	cout << ID.size() << endl;
		cout << C.size() << endl;
	for(i = 0; i < C.size(); i++)
	{
		cout << C[i] << endl;
	}
	
}


⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?