新建 文本文档.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 + -
显示快捷键?