词法分析

编译原理作业~

没有按照dfa来做是我的错、、等我预习完了再改吧

#include<iostream>
#include<cstring>
#include<cstdio>
#include<string>
#include<map>
using namespace std;
#define lowcase (s2[j]>='a'&&s2[j]<='z')
#define upcase (s2[j]>='A'&&s2[j]<='Z')
#define number (s2[j]>='0'&&s2[j]<='9')
string s1,s2,s3;
void init(map<string,int> &x)
{
    
    x["begin"]=1;
    x["if"]=2;
    x["then"]=3;
    x["while"]=4;
    x["do"]=5;
    x["end"]=6;
    x["+"]=13;
    x["-"]=14;
    x["*"]=15;
    x["/"]=16;
    x[":"]=17;
    x[":="]=18;
    x["<"]=19;
    x["<>"]=20;
    x["<>"]=21;
    x["<="]=22;
    x[">"]=23;
    x[">="]=24;
    x["="]=25;
    x[";"]=26;
    x["("]=27;
    x[")"]=28;
    x["#"]=0;
    
}
void trans(string &s)
{
    int i=0;
    int k=s.length();
    while(i<k-1)
    {
        if(s[i]=='0'){s.erase(0,1);break;}
        i++;
    }
}
int pend(string &s)
{
    int len=(int)s.length();
    if((s[0]>='0'&&s[0]<='9'))
    {
        int i=0;
        while((i<=len-1)&&(s[i]>='0'&&s[i]<='9')){i++;}
        if(i==len){return 0;}
        else if((s[i]<='z'&&s[i]>='a')||(s[i]<='Z'&&s[i]>='A')){return 1;}
        else
        {return 0;}
    }
    else return 0;
}
int main()
{
    
    map<string,int>df;
    init(df);
    while(getline(cin,s1))
    {
        s2.clear();
        s3.clear();
        int i=0,j=0;
        int len1=(int)s1.length();
        while(i<len1)
        {
            while(s1[i]!=' '&&i<len1)
            {
                s2.append(s1,i,1);
                i++;
            }
            if(s1[i]==' '){i++;}
            if(!df[s2])
            {
                j=0;
                int len2=(int)s2.length();
                cout<<s2<<endl;
                if(pend(s2)){printf("error\n");goto en;}
                while(j<len2)
                {
                    
                    if(j<len2&&number)
                        while(j<len2&&number)
                        {s3.append(s2,j,1);j++;trans(s3);}
                    
                    else if(lowcase||upcase)
                        while(j<len2&&((lowcase||upcase||number))){s3.append(s2,j,1);j++;}
                    
                    else
                        while(j<len2&&(!(lowcase||upcase||number))){s3.append(s2,j,1);++j;}
                    
                    int len3=(int)s3.length();
                    
                    if(df[s3]&&len3)
                        cout<<'('<<s3<<','<<df[s3]<<')'<<endl;
                    
                    else if(len3&&s3[0]<='9'&&s3[0]>='0')
                        cout<<'('<<11<<','<<s3<<')'<<endl;
                    else
                        cout<<'('<<10<<','<<s3<<')'<<endl;
                    
                    s3.clear();
                }
            }
            else{cout<<'('<<s2<<','<<df[s2]<<')'<<endl;}
            s2.clear();
        }
    en:;
    }
    return 0;
}
/*
begin end

if then

x y

begin x:=9: if x>9 then x:=2*x+1/3; end #

00009

10x
 */


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值