词法分析器(简单)

#include <iostream>
#include<string.h>
#include<stdio.h>
using namespace std;
string ba[5]= {"while","if","else","switch","case"};//关键字表
int hash1[305]= {};
string str,str1;
int len;
char ch;
void start()//初始化符号和数字表
{
    int i,j;
    //初始化运算符、界符
    hash1['+']=8;
    hash1['-']=9;
    hash1['*']=10;
    hash1[';']=13;
    hash1['<']=11;
    hash1['=']=12;
    //初始化数字和字母
    for(i=49,j=97; i<=57||j<=122; j++)
    {
        if(i<=57)
        {
            hash1[i]=7;
            i++;
        }
        hash1[j]=-1;
    }
}
void print()//打印关键字,标识符、或数字(不包括运算符、界符)
{
    if(hash1[str1[0]]==7)//打印数字
    {
        cout<<"("<<str1<<","<<"num)"<<endl;
    }
    else//打印关键字,标识符
    {
        int i;
        for(i=0; i<5; i++)
        {
            if(str1==ba[i])//打印关键字
            {
                cout<<"("<<str1<<","<<i+1<<")"<<endl;
                break;
            }
        }
        if(i==5)//打印标识符
        {
            cout<<"("<<str1<<","<<"id)"<<endl;
        }
    }
}
void clean()//字符串表初始化
{
    if(str1!="")
    {
        print();
        str1="";
    }
}
int main()
{
   // freopen("C:\\Users\\Administrator\\Desktop\\888.txt","r",stdin);
    start();
    while(cin>>str)//多组输入,忽略空格
    {
        len=str.size();//获取字符串长度
        ch=str[0];//获取首字符,用于判断该字符串是数字串还是字母串
        str1="";//字符串表初始化
        for(int i=0; i<len; i++)
        {
            if(!hash1[str[i]])//识别非法字符并输出,不影响后续输入
            {
                clean();
                cout<<"("<<str[i]<<",error)"<<endl;
                continue;
            }
            if(i<len-1)
            {
                if(hash1[str[i]]>=8&&hash1[str[i]]<=13)//识别运算符及界符
                {
                    clean();
                    if(hash1[str[i+1]]>=8&&hash1[str[i+1]]<=13)//识别运算符及界符,+,-,*,=.
                    {
                        if((str[i]=='='||str[i]=='<')&&str[i+1]=='=')//打印运算符"==","<="
                        {
                            cout<<"("<<str[i]<<str[i+1]<<","<<"11)"<<endl;
                        }
                        else//打印运算符或界符
                        {
                            cout<<"("<<str[i]<<","<<hash1[str[i]]<<")"<<endl;
                            cout<<"("<<str[i+1]<<","<<hash1[str[i+1]]<<")"<<endl;
                        }
                        i++;
                    }
                    else//打印识别运算符或界符
                    {
                        cout<<"("<<str[i]<<","<<hash1[str[i]]<<")"<<endl;
                    }
                    if(i<len-1&&(hash1[str[i+1]]==-1||hash1[str[i+1]]==7))
                    {
                        ch=str[i+1];//获取子串首字符,用于判断该字符串是数字串还是字母串
                    }
                }
                else//识别字母和数字
                {
                    if(hash1[ch]==7&&hash1[str[i]]==-1)//如果首字符是数字,而后续字符是字母,则属于非法字符
                    {
                        cout<<"("<<str[i]<<",error)"<<endl;
                    }
                    else//将合法字符加入字符串表
                    {
                        str1=str1+str[i];
                    }
                }
            }
            else//将合法字符加入字符串表
            {
                str1=str1+str[i];
                print();
            }
        }
    }
    return 0;
}


输入:

运行结果:


该程序用到的:

运算符:+,-,*,<=,<,=,==

界符:;

关键字:while,if,else,switch,case

最重要的是,这段代码执行前,要建立一个文本文件,将要输入的放进去!有不了解c++ freopen的可以到网上自行查阅,这里就不做过多叙述了。

这个词法分析器只是给大家提供一个思路,还有很多可以扩展的地方,有兴趣的可以做一做。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值