编译原理 一个小作业

之前写的一个小作业

题目:词法分析实验

C++做的

实验代码:

bianyi1.cpp:

#include <iostream>
#include <cctype>
#include <fstream>
#include <string>
#include "bianyi.h"
using namespace std;

int main()
{
    char first;       //每次读入的第一个字符
    string word = ""; //组成的单词
    int num = 0;      //每识别出一个单词,用num对应符号表下表存入符号表
    int row = 0;      //txt文件中行数

    ifstream in("text.txt");
    string line; //从文件中读入的每行字符串
    while (getline(in, line))
    {
        row++;
        int s = line.size(); //确定该行的字符数目
        int i = 0;           //用于计数

        while (i < s)
        {
            first = line[i];
            //当读到的第一个字符为空格时
            while (isspace(first))
            {
                i++;
                first = line[i];
            }
            //读取到的第一个字符为字母时
            while (judge_Word(first))
            {
                word += first;
                i++;
                first = line[i];
                while (judge_Word(first) || judge_Number(first))
                {
                    word += first;
                    i++;
                    first = line[i];
                }
                if (judge_ReserveWord(word))
                {
                    T[num].category = 1;
                    T[num].symbol1 = word;

                    num++;
                    word = "";
                }
                else
                {
                    T[num].category = 2;
                    T[num].symbol1 = word;
                    num++;

                    word = "";
                }
            }
            //读取到的第一个字符为运算符时
            while (judge_Operator(first))
            {
                T[num].category = 4;
                T[num].symbol1 = first;

                num++;
                i++;
                first = line[i];
            }
            //读取的第一个字符为数字时
            while (judge_Number(first))
            {
                word += first;
                i++;
                first = line[i];
                if (isspace(first) || judge_Operator(first) || judge_Delimmiter(first))
                {
                    T[num].category = 3;
                    T[num].symbol1 = word;

                    num++;

                    word = "";
                }
                else if (judge_Word(first))
                {
                    cout << "erro:" << row << " line definition!" << endl;
                    break;
                }
            }
            //读取到的第一个字符为分隔符时
            while (judge_Delimmiter(first))
            {
                T[num].category = 5;
                T[num].symbol1 = first;
                num++;
                i++;
                first = line[i];
            }
        }
    }
    ofstream out("text1.txt");
    for (int m = 0; m < 100; m++)
    {
        if (T[m].category != 0)
        {
            cout << "(" << T[m].category << ",'" << T[m].symbol1 << "')" << endl;
            out << " (" << T[m].category << ",'" << T[m].symbol1 << "')" << endl;
        }
    }
    return 0;
}

bianyi.h:

#include <string>
#include <cctype>
using namespace std;
struct symbolTable
{
    int category;   //单词种别,未确定时置为0
    string symbol1; //符号自身的值
};                  //译码表

struct reservedWord
{
    int category = 1; //单词种别
    string symbol2;   //符号自身的值
};                    //保留字

struct Delimmiter
{
    int category = 4; //单词种别
    string symbol3;   //符号自身的值
};                    //分隔符

struct Operator
{
    int category = 4; //单词种别
    string symbol4;   //符号自身的值
};                    //运算符
struct Identifier
{
    int category = 2; //单词种别
    string symbol5;   //符号自身的值
};                    //标识符

symbolTable T[100]; //定义符号表

//判断该字符是否是字母
bool judge_Word(char x)
{
    if (isalpha(x))
    {
        return true;
    }
    else
        return false;
}

//判断该字符是否是数字
bool judge_Number(char x)
{
    if (isdigit(x))
    {
        return true;
    }
    else
        return false;
}
//判断该字符是否是界符
bool judge_Delimmiter(char x)
{
    if (x == ',' || x == ';' || x == '(' || x == ')' || x == '{' || x == '}')
    {
        return true;
    }
    else
        return false;
}
//判断是否是运算符
bool judge_Operator(char x)
{
    if (x == '+' || x == '-' || x == '*' || x == '=' || x == '/')
    {
        return true;
    }
    else
        return false;
}

//判断是否是保留字
bool judge_ReserveWord(string x)
{
    if (x == "if" || x == "int" || x == "for" || x == "while" || x == "do" || x == "return" || x == "break" || x == "continue")
    {
        return true;
    }
    else
        return false;
}

 

同时在源代码目录下创建两个txt文件,一个放输入内容,一个放输出内容:

输入文件:

 

输出文件:

 

posted @ 2020-03-14 16:08  ayula  阅读(188)  评论(0)    收藏  举报