编译原理实验要实现简单的编译器,因此记录一下我的学习过程。今天是最简单的词法分析。
#include<iostream>
#include<fstream>
#include<string>
using namespace std;
int main()
{
char in[300];
char out[50] = { 0 };
int j = 0;
ifstream infile("G:/学习/编译原理/实验/result/in.txt ", ios::in);
if (!infile)
{
cout << "打开输入文件失败!" << endl;
return 0;
}
ofstream outfile("G:/学习/编译原理/实验/result/out.txt", ios::out);
if (!outfile)
{
cout << "打开输出文件失败!" << endl;
return 0;
}
for (int i = 0; i < 300; i++)
{
in[i] = infile.get();
//cout << in[i] << "#" ;
}
for (int i = 0; i < 300; i++)
{
switch (in[i])
{
case'{':
out[j] = in[i];
outfile <<"分隔符:"<< out << endl;
memset(out, 0, sizeof(out) / sizeof(char));
j = 0;
break;
case'}':
out[j] = in[i];
outfile << "分隔符:" << out[j] << endl;
memset(out, 0, sizeof(out) / sizeof(char));
j = 0;
break;
case'(':
out[j] = in[i];
outfile << "分隔符:" << out << endl;
memset(out, 0, sizeof(out) / sizeof(char));
j = 0;
break;
case')':
out[j] = in[i];
outfile << "分隔符:" << out << endl;
memset(out, 0, sizeof(out) / sizeof(char));
j = 0;
break;
case'+':
out[j] = in[i];
if ('+' == in[i + 1]|| '=' == in[i + 1])//++/+=
{
j++;
out[j] = in[i++];
}
outfile << "运算符:" << out << endl;
memset(out, 0, sizeof(out) / sizeof(char));
j = 0;
break;
case'-':
out[j] = in[i];
if ('-' == in[i + 1] || '=' == in[i + 1])//--/-=
{
j++;
out[j] = in[i++];
}
outfile << "运算符:" << out << endl;
memset(out, 0, sizeof(out) / sizeof(char));
j = 0;
break;
case'*':
out[j] = in[i];
if ('=' == in[i + 1])//*=
{
j++;
out[j] = in[i++];
}
outfile << "运算符:" << out << endl;
memset(out, 0, sizeof(out) / sizeof(char));
j = 0;
break;
case'/':
out[j] = in[i];
if ('=' == in[i + 1])// /=
{
j++;
out[j] = in[i++];
}
outfile << "运算符:" << out << endl;
memset(out, 0, sizeof(out) / sizeof(char));
j = 0;
break;
case'!':
out[j] = in[i];
if ('=' == in[i + 1])//!=
{
j++;
out[j] = in[i++];
}
outfile << "运算符:" << out << endl;
memset(out, 0, sizeof(out) / sizeof(char));
j = 0;
break;
case'>':
out[j] = in[i];
if ('=' == in[i + 1])//>=
{
j++;
out[j] = in[i++];
}
outfile << "运算符:" << out << endl;
memset(out, 0, sizeof(out) / sizeof(char));
j = 0;
break;
case'<':
out[j] = in[i];
if ('=' == in[i + 1])//<=
{
j++;
out[j] = in[i++];
}
outfile << "运算符:" << out << endl;
memset(out, 0, sizeof(out) / sizeof(char));
j = 0;
break;
case'=':
out[j] = in[i];
if ('=' == in[i + 1])//==
{
j++;
out[j] = in[i++];
}
else
{
int k = i+1;
while (!(';' == in[k] || ',' == in[k]))
{
}
}
outfile << "运算符:" << out << endl;
memset(out, 0, sizeof(out) / sizeof(char));
j = 0;
break;
case';':
out[j] = in[i];
outfile << out << endl;
memset(out, 0, sizeof(out) / sizeof(char));
j = 0;
break;
default:
break;
}//switch
if (' ' == in[i] || '\n' == in[i])//
{
continue;
}
if (in[i] >= 'a'&&in[i] <= 'z')
{
out[j] = in[i];
while (in[i + 1] != ' '&&in[i + 1] != '('&&
in[i + 1] != ';')
{
i++;
j++;
out[j] = in[i];
}
if ("while" == out|| "do" == out || "if" == out ||
"else" == out || "main" == out ||
"void" == out || "int" == out ||
"double" == out || "float" == out ||
"for" == out || "break" == out ||
"continue" == out || "return" == out)
{
outfile <<"关键字:"<< out << endl;
memset(out, 0, sizeof(out) / sizeof(char));
j = 0;
}
else
{
outfile << "标识符:" << out << endl;
memset(out, 0, sizeof(out) / sizeof(char));
j = 0;
}
}
if (in[i] >= '0'&&in[i] <= '9')
{
out[j] = in[i];
while (in[i + 1] >= '0'&&in[i + 1] <= '9'|| '.'==in[i + 1])
{
i++;
j++;
out[j] = in[i];
}
outfile << "数字:" << out << endl;
memset(out, 0, sizeof(out) / sizeof(char));
j = 0;
}
}//for
cout << "编译结束" << endl;
outfile.close();
infile.close();
return 0;
}