C++:词法分析

词法分析的思路比较简单,先判断是字母还是数字,如果是字母,那么开始判断是关键字还是标识符。如果是其它的分隔符之类的,进行处理即可,我写的分析程序十分简单,大神可以略过哦。


#include<iostream>
#include<fstream>
#include<string>
#include<ctype.h>//用来判断变量类型
using namespace std;
ifstream hengbao("source.txt", ios::in);
string key[13] = { "if", "else", "for", "while", "do", "return", "break", "continue", "int", "void", "main", "const", "cout" }; //关键字
string border[7] = { ",", ";", "{", "}", "(", ")", "//" };        //分界符
string arithmetic[6] = { "+", "-", "*", "/", "++", "--" };        //运算符
string relation[7] = { "<", "<=", "=", ">", ">=", "==", "!=" };   //关系运算符                                       
string lableconst[80];//标识符
int constnum = 40;
int lableconstnum = 0;        //统计常数和标识符数量 
int linenum = 1;
char wbuffer = NULL;//缓冲器,用于一个一个地读source.txt文件里的字符
bool search(string searchchar, int wordtype)
{
    switch (wordtype)
    {
    case 1://判断是否为关键字
    {
        for (int i = 0; i < 13; i++)
        {
            if (searchchar == key[i])
            {
                return true;
            }
        }
        return false;
        break;
    }
    case 2://判断是否为分解符
    {
        for (int i = 0; i < 7; i++)
        {
            if (searchchar == border[i])
            {
                return true;
            }
        }
        return false;
        break;
    }
    case 3://运算符
    {
        for (int i = 0; i < 6; i++)
        {
            if (searchchar == arithmetic[i])
            {
                return true;
            }
        }
        return false;
        break;
    }
    case 4://关系运算符
    {
        for (int i = 0; i < 7; i++)
        {
            if (searchchar == relation[i])
            {
                return true;
            }
        }
        return false;
        break;
    }
    case 5:
    {
        int i = 0;
        for (;i < lableconstnum; i++)
        {
            if (searchchar == lableconst[i])
            {
                return true;
            }
        }
        lableconst[i] = searchchar;
        lableconstnum++;
        return false;
        break;
    }
    default:
        cout << "error ";
        break;
    }
    return false;
}
char alphaprocess(char buffer)                //字符处理过程
{
    int i = -1;
    char alphatp[20];
    while ((isalpha(buffer)) || (isdigit(buffer)))//这两个函数分别是判字符和判数字函数位于ctype.h中
    {
        alphatp[++i] = buffer;
        hengbao.get(buffer);
    }
    alphatp[i + 1] = '\0';//在末尾添加字符串结束标志
    if (search(alphatp, 1))
        cout << "linenum:  " << linenum << "   String=  " << alphatp << "\t\t\t" << "关键字" << endl;
    else
    {
        search(alphatp, 5);              //标识符
        cout << "linenum:  " << linenum << "   String=  " << alphatp << "\t\t\t" << "标识符" << endl;
    }
    return(buffer);
}
char digitprocess(char buffer)  //数字处理过程
{
    int i = -1;
    char digittp[20];
    while ((isdigit(buffer)))
    {
        digittp[++i] = buffer;
        hengbao.get(buffer);
    }
    digittp[i + 1] = '\0';
    cout << "linenum:  " << linenum << "   String=  " << digittp << "\t\t\t" << "数据" << endl;
    return(buffer);
}
char otherprocess(char buffer)   //分界符、运算符、逻辑运算符、等
{
    char othertp[20];
    bool otype, otypetp;
    othertp[0] = buffer;
    othertp[1] = '\0';
    if (otype = search(othertp, 3))
    {
        hengbao.get(buffer);
        othertp[1] = buffer;
        othertp[2] = '\0';
        if (otypetp = search(othertp, 3))  //判断该运算符是否是由连续的两个字符组成的
        {
            cout << "linenum:  " << linenum << "   String=  " << othertp << "\t\t\t" << "运算符" << endl;
            hengbao.get(buffer);
        }
        else                           //单字符逻辑运算符
        {
            othertp[1] = '\0';
            cout << "linenum:  " << linenum << "   String=  " << othertp << "\t\t\t" << "逻辑运算符" << endl;
        }
    }

    if (otype = search(othertp, 4))  //关系运算符
    {
        hengbao.get(buffer);
        othertp[1] = buffer;
        othertp[2] = '\0';
        if (otypetp = search(othertp, 4))  //判断该关系运算符是否是由连续的两个字符组成的
        {
            cout << "linenum:  " << linenum << "   String=  " << othertp << "\t\t\t" << "关系运算符" << endl;
            hengbao.get(buffer);
        }
        else                           //单字符逻辑运算符
        {
            othertp[1] = '\0';
            cout << "linenum:  " << linenum << "   String=  " << othertp << "\t\t\t" << "逻辑运算" << endl;
        }
    }

    if (otype = search(othertp, 2))   //分界符
    {
        cout << "linenum:  " << linenum << "   String=  " << othertp << "\t\t\t" << "分界符" << endl;
        hengbao.get(buffer);
    }

    return(buffer);
}
int main()
{

    for (int i = 0; i <= 50; i++)
    {
        lableconst[i] = "  ";//用于保存标识符
    }
    if (!hengbao)
    {
        cout << "文件打开错误" << endl;
    }
    else
    {
        hengbao.get(wbuffer);
        while (!hengbao.eof())
        {
            if (wbuffer == '\n')
            {
                linenum++;
                hengbao.get(wbuffer);
            }
            else if (isalpha(wbuffer))// 如果是字母,那么当然可能是标识符也可能是关键字,进行检查
            {
                wbuffer = alphaprocess(wbuffer);
            }
            else if (isdigit(wbuffer))
            {
                wbuffer = digitprocess(wbuffer);
            }
            else
            {
                wbuffer = otherprocess(wbuffer);
            }
        }
        cout << "标识符个数是:" << lableconstnum << "分别是" << endl;
        for (int i = 0; i < lableconstnum; i++)
        {
            cout << lableconst[i] << " ";
        }
        cout << endl;
        cout << "词法分析完成";
        hengbao.close();
    }
    system("pause");
    return 0;
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值