编译原理—词法分析器

编译原理实验要实现简单的编译器,因此记录一下我的学习过程。今天是最简单的词法分析。

#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;
}

猜你喜欢

转载自blog.csdn.net/zhang_han666/article/details/80431625