词法分析优化

<pre name="code" class="cpp">#include <iostream>
#include <cstring>
#include <string>
using namespace std;
class Node
{
public:
    string name;
    int type;

};
struct word
{
    Node node[1000];
    int ans,t;
    string sstack;

    void lian10_11()
    {
        if(sstack[0]>='0'&&sstack[0]<='9')
            //cout<<"11 "<<sstack<<endl;
        {
            node[t].name=sstack;
            node[t++].type=11;
        }
        if(sstack[0]>='a'&&sstack[0]<='z')
        {
            node[t].name=sstack;
            node[t++].type=10;
        }
        sstack.clear();
    }
    void  getarray(string s)
    {
        t=0;
        int n=s.length();
        sstack.clear();
        for(int i=0; i<n; i++)
        {
            if(s[i]=='b')
            {
                if(s.substr(i,5)=="begin"&&s[i+5]==' ')
                {
                    lian10_11();
                    {
                        node[t].name="begin";
                        node[t++].type=1;
                    }
                    i+=4;
                }
                else sstack+=s[i];
            }
            else if(s[i]=='i')
            {
                if(s.substr(i,2)=="if"&&s[i+2]==' ')
                {
                    lian10_11();
                    {
                        node[t].name="if";
                        node[t++].type=2;
                    }
                    i+=1;
                }
                else sstack+=s[i];
            }
            else  if(s[i]=='t')
            {
                if(s.substr(i,4)=="then"&&s[i+4]==' ')
                {
                    lian10_11();
                    {
                        node[t].name="then";
                        node[t++].type=3;
                    }
                    i+=3;
                }
                else sstack+=s[i];
            }
            else if(s[i]=='w')
            {
                if(s.substr(i,5)=="while"&&s[i+5]==' ')
                {
                    lian10_11();
                    {
                        node[t].name="while";
                        node[t++].type=4;
                    }
                    i+=4;
                }
                else sstack+=s[i];
            }
            else if(s[i]=='d')
            {
                if(s.substr(i,2)=="do"&&s[i+2]==' ')
                {
                    lian10_11();
                    {
                        node[t].name="do";
                        node[t++].type=5;
                    }
                    i+=1;
                }
                else sstack+=s[i];
            }
            else if(s[i]=='e')
            {
                if(s.substr(i,3)=="end"&&s[i+3]==' ')
                {
                    lian10_11();
                    {
                        node[t].name="end";
                        node[t++].type=6;
                    }
                    i+=2;
                }
                else sstack+=s[i];
            }
            else if(s[i]=='+')
            {
                lian10_11();
                {
                    node[t].name="+";
                    node[t++].type=13;
                }

            }
            else if(s[i]=='-')
            {
                lian10_11();
                {
                    node[t].name="-";
                    node[t++].type=14;
                }

            }
            else if(s[i]=='*')
            {
                lian10_11();
                {
                    node[t].name="*";
                    node[t++].type=15;
                }

            }
            else if(s[i]=='/')
            {
                lian10_11();
                {
                    node[t].name="/";
                    node[t++].type=16;
                }

            }
            else if(s[i]==':')
            {
                lian10_11();
                if(s[i+1]=='=')
                {
                    {
                        node[t].name=":=";
                        node[t++].type=18;
                    }
                    i++;
                }
                else
                {
                    node[t].name=":";
                    node[t++].type=17;
                }

            }
            else if(s[i]=='<')
            {
                lian10_11();
                if(s[i+1]=='>')
                {
                    {
                        node[t].name="<>";
                        node[t++].type=21;
                    }
                    i++;
                }
                else if(s[i+1]=='=')
                {
                    {
                        node[t].name="<=";
                        node[t++].type=22;
                    }
                    i++;
                }
                else
                {
                    node[t].name="<";
                    node[t++].type=20;
                }

            }
            else if(s[i]=='>')
            {
                lian10_11();
                if(s[i+1]=='=')
                {
                    {
                        node[t].name=">=";
                        node[t++].type=24;
                    }
                    i++;
                }

                else
                {
                    node[t].name=">";
                    node[t++].type=23;
                }

            }
            else if(s[i]=='=')
            {
                lian10_11();
                {
                    node[t].name="=";
                    node[t++].type=15;
                }

            }
            else if(s[i]==';')
            {
                lian10_11();
                {
                    node[t].name=";";
                    node[t++].type=26;
                }

            }
            else if(s[i]=='(')
            {
                lian10_11();
                {
                    node[t].name="(";
                    node[t++].type=27;
                }

            }
            else if(s[i]==')')
            {
                lian10_11();
                {
                    node[t].name=")";
                    node[t++].type=28;
                }

            }
            else if(s[i]=='#')
            {
                lian10_11();
                {
                    node[t].name="#";
                    node[t++].type=0;
                }

            }

            else if((s[i]>='0'&&s[i]<='9')||(s[i]>='a'&&s[i]<='z'))
                sstack+=s[i];
        }
        if(!sstack.empty())
        {
            lian10_11();
        }
        ans=t;
    }
};

int main()
{
    string str;
    getline(cin,str);
    word w;
    w.getarray(str);
    cout<<w.ans<<endl;
    for(int i=0; i<w.ans; i++)
        cout<<i<<" :  "<<w.node[i].name<<" "<<w.node[i].type<<endl;
    return 0;
}



                
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值