编译原理之基于扫描器的表达式语法分析+逆波兰表达式生成

模拟法

Preset.h

#ifndef PRESET_H_INCLUDED
#define PRESET_H_INCLUDED

#define AnsNum 100010
#define AnsLen 110
#define TableNum 110
#define DeliNum 12
#define KeyNum 7

int consttop=0;
int identtop=0;
int cconsttop=0;
int sconsttop=0;
int top;

const int DelimeterNum=22;
const int Keynum=9;

//界符表
char Delimeters[TableNum][TableNum]={"(",")","<<","{","}",";","=","+","-","*","_","[","]",".","==","<=","<",">",">=",",","/","\""}; //i+4
//关键字表
char Key[TableNum][TableNum]={"int", "main", "void", "if", "else", "char", "cout","double","float"};    //i+26
//字符常数表
char Char_Constant[TableNum];
//字符串常数表
char String_Constant[TableNum][TableNum];
//常数表
char Constant[TableNum][TableNum];
//符号表总表(SYNBL)
char Identifier[TableNum][TableNum];

std::string Str;
int Syntax_top;

void Handle();
void HandleE();
void HandleA();
void HandleT();
void HandleB();
void HandleF();

int Syn_top;
int Sem_top;
char SYN[TableNum][TableNum];
char SEM[TableNum][TableNum];

#endif // PRESET_H_INCLUDED

main.c

#include <iostream>
#include <cstring>
#include <windows.h>
#include <cstdio>
#include "Preset.h"

using namespace std;

typedef struct token
{
    char target[AnsLen];
    int num;    //Token类别 Identifier——0 Char_Constant——1 String_Constant——2 Constant——3 Key——4...25 Delimeters——26...34
}Token;

Token AnsToken[AnsNum];

int main()
{
    top=0;
    char TempToken[AnsNum];
    int TempTop=0;
    bool quotation=false;

    freopen("input.c","r",stdin);
    freopen("output.c","w",stdout);

    while(cin >> Str)   //输入源代码
    {
        if(Str[0]=='#')break;
        for(int p=0;Str[p]!='#';)
        {
            if(Str[p]==' ')
            {
                p++;
                continue;
            }
            //判断标识符
            else if(Str[p]=='_' || isalpha(Str[p]))
            {
                for(;Str[p]!=0 && Str[p]!=' ';p++)  //结束标志-1即为0或者' '
                {
                    if(Str[p]=='_' || isalpha(Str[p]) || isdigit(Str[p]))
                    {
                        TempToken[TempTop++]=Str[p];
                    }
                    else
                    {
                        break;
                    }
                }
                //给AnsToken.target赋值
                strcpy(AnsToken[top].target,TempToken);
                //查找关键字
                for(int i=0;i<Keynum;i++)
                {
                    if(!strcmp(TempToken,Key[i]))
                    {
                        //给AnsToken.num赋值
                        AnsToken[top].num=i+26;
                        break;
                    }
                }
                //如果不是关键字,查找标识符表
                if(AnsToken[top].num<26)
                {
                    AnsToken[top].num=26;//标识符为0
                    for(int i=0;i<identtop;i++)
                    {
                        if(!strcmp(TempToken,Identifier[i]))
                        {
                            //给AnsToken.num赋值
                            AnsToken[top].num=0;
                            break;
                        }
                    }
                    if(AnsToken[top].num)
                    {
                        AnsToken[top].num=0;
                        strcpy(Identifier[identtop++],TempToken);
                    }
                }
                //清空TempToken
                TempTop=0;
                memset(TempToken,0,sizeof(TempToken));
                top++;
            }
            else if(isdigit(Str[p]))    //只能识别常数
            {
                bool Point=false;
                for(;Str[p]!=0 && Str[p]!=' ';p++)  //结束标志-1即为0或者' '
                {
                    if(isdigit(Str[p]))
                    {
                        TempToken[TempTop++]=Str[p];
                    }
                    else if(Str[p]=='.')
                    {
                        if(!Point)
                        {
                            TempToken[TempTop++]=Str[p];
                            Point=true;
                        }
                        else
                        {
                            putchar(7);
                            cout << "Compile Error!!!!!" << endl;
                            cout << "Wrong number." << endl;
                            exit(0xffffffff);
                        }
                    }
                    else
                    {
                        break;
                    }
                }
                //给AnsToken.target赋值
                strcpy(AnsToken[top].target,TempToken);
                //查找常数表
                for(int i=0;i<identtop;i++)
                {
                    if(!strcmp(TempToken,Constant[i]))
                    {
                        //给AnsToken.num赋值
                        AnsToken[top].num=3;
                        break;
                    }
                }
                if(AnsToken[top].num!=3)
                {
                    AnsToken[top].num=3;
                    strcpy(Constant[consttop++],TempToken);
                }
                //清空TempToken
                TempTop=0;
                memset(TempToken,0,sizeof(TempToken));
                top++;
            }
            else if(Str[p]==' ')
            {
                p++;
            }
            else if(Str[p]=='\'')
            {
                quotation=!quotation;
                TempToken[TempTop]=Str[p];
                strcpy(AnsToken[top].target,TempToken);
                AnsToken[top++].num=24;

                TempToken[TempTop]=Str[++p];
                strcpy(AnsToken[top].target,TempToken);
                for(int i=0;i<cconsttop;i++)
                {
                    if(TempToken[0]==Char_Constant[i])
                    {
                        AnsToken[top].num=1;
                    }
                }
                if(AnsToken[top].num!=1)
                {
                    AnsToken[top].num=1;
                    Char_Constant[cconsttop++]=TempToken[0];
                }
                top++;

                if(Str[p+1]!='\'')
                {
                    putchar(7);
                    cout << "Compile Error!!!!!" << endl;
                    cout << "Wrong Character." << endl;
                    exit(0xffffffff);
                }
                else
                {
                    p++;
                    quotation=!quotation;
                    TempToken[TempTop]=Str[p];
                    strcpy(AnsToken[top].target,TempToken);
                    AnsToken[top++].num=24;
                    TempToken[0]=0;
                    p++;
                }
            }
            else if(Str[p]=='\"')
            {
                quotation=!quotation;
                TempToken[TempTop]=Str[p];
                strcpy(AnsToken[top].target,TempToken);
                AnsToken[top++].num=25;
                p++;

                //识别字符串常量
                while(Str[p]!='\"')
                {
                    if(Str[p]=='#')
                    {
                        putchar(7);
                        cout << "Compile Error!!!!!" << endl;
                        cout << "Wrong Character." << endl;
                        exit(0xffffffff);
                    }
                    TempToken[TempTop++]=Str[p];
                    p++;
                }

                strcpy(AnsToken[top].target,TempToken);
                for(int i=0;i<sconsttop;i++)
                {
                    if(strcmp(!TempToken,String_Constant[i]))
                    {
                        AnsToken[top].num=2;
                    }
                }
                if(AnsToken[top].num!=2)
                {
                    AnsToken[top].num=2;
                    strcpy(String_Constant[sconsttop++],TempToken);
                }
                top++;

                //清空TempToken
                TempTop=0;
                memset(TempToken,0,sizeof(TempToken));

                quotation=!quotation;
                TempToken[TempTop]=Str[p];
                strcpy(AnsToken[top].target,TempToken);
                AnsToken[top++].num=25;
                //清空TempToken
                TempTop=0;
                memset(TempToken,0,sizeof(TempToken));
                p++;
            }
            else if((Str[p]=='<' && (Str[p+1]=='<' || Str[p+1]=='=')) || ((Str[p]=='>' || Str[p]=='=') && Str[p+1]=='='))
            {
                TempToken[0]=Str[p++];
                TempToken[1]=Str[p++];
                TempToken[2]=0;

                //给AnsToken.target赋值
                strcpy(AnsToken[top].target,TempToken);
                //查找界符表
                for(int i=0;i<DelimeterNum;i++)
                {
                    if(!strcmp(TempToken,Delimeters[i]))
                    {
                        //给AnsToken.num赋值
                        AnsToken[top].num=i+4;
                        break;
                    }
                }

                //清空TempToken
                TempTop=0;
                memset(TempToken,0,sizeof(TempToken));
                top++;
            }
            else
            {
                //识别单目运算符
                if(Str[p]!=0 && Str[p]!=' ' && !isalpha(Str[p]) && !isdigit(Str[p]) && Str[p]!='_' && Str[p]!='#')  //结束标志-1即为0或者' '
                {
                    TempToken[TempTop++]=Str[p++];
                }
                else
                {
                   break;
                }
                TempToken[TempTop]=0;
                for(int j=0;j<DelimeterNum;j++)
                {
                    if(!strcmp(TempToken,Delimeters[j]))
                    {
                        strcpy(AnsToken[top].target,TempToken);
                        AnsToken[top++].num=j+4;
                        break;
                    }
                }
                TempTop=0;
            }
        }
    }
    AnsToken[top].target[0]='#';
    AnsToken[top++].num=-1;
    for(int i=0;i<top;i++)
        cout << "< " << AnsToken[i].target << " , " << AnsToken[i].num << " >" << endl;
    Handle();
    return 0;
}

void Handle()
{
    Syntax_top=0;
    HandleE();
    cout << endl;
    if(AnsToken[Syntax_top].target[0]=='#')
    {
        cout << "Yes" << endl;
        Syn_top=-1;
        Sem_top=-1;
        strcpy(SYN[++Syn_top],"#");
        for(int i=0;i<top;i++)
        {
            int flag=0;
            switch(SYN[Syn_top][0])
            {
            case '#':
                if(AnsToken[i].target[0]=='#')
                {
                    flag=1;
                }
                else if(AnsToken[i].target[0]=='+' || AnsToken[i].target[0]=='-' || AnsToken[i].target[0]=='*' || AnsToken[i].target[0]=='/')
                {
                    strcpy(SYN[++Syn_top],AnsToken[i].target);
                }
                else
                {
                    strcpy(SEM[++Sem_top],AnsToken[i].target);
                }
                break;
            case '+':
            case '-':
                if(AnsToken[i].target[0]=='#' || AnsToken[i].target[0]==')' || AnsToken[i].target[0]=='+' || AnsToken[i].target[0]=='-')
                {
                    strcpy(SEM[++Sem_top],SYN[Syn_top--]);
                    i--;
                }
                else if(AnsToken[i].target[0]=='(' || AnsToken[i].target[0]=='*' || AnsToken[i].target[0]=='/')
                {
                    strcpy(SYN[++Syn_top],AnsToken[i].target);
                }
                else
                {
                    strcpy(SEM[++Sem_top],AnsToken[i].target);
                }
                break;
            case '*':
            case '/':
                if(AnsToken[i].target[0]=='#' || AnsToken[i].target[0]==')' || AnsToken[i].target[0]=='+' || AnsToken[i].target[0]=='-' || AnsToken[i].target[0]=='*' || AnsToken[i].target[0]=='/')
                {
                    strcpy(SEM[++Sem_top],SYN[Syn_top--]);
                    i--;
                }
                else if(AnsToken[i].target[0]=='(')
                {
                    strcpy(SYN[++Syn_top],AnsToken[i].target);
                }

                else
                {
                    strcpy(SEM[++Sem_top],AnsToken[i].target);
                }
                break;
            case '(':
                if(AnsToken[i].target[0]=='+' || AnsToken[i].target[0]=='-' || AnsToken[i].target[0]=='*' || AnsToken[i].target[0]=='/')
                {
                    strcpy(SYN[++Syn_top],AnsToken[i].target);
                }
                else if(AnsToken[i].target[0]==')')
                {
                    Syn_top--;
                }
                else
                {
                    strcpy(SEM[++Sem_top],AnsToken[i].target);
                }
                break;
            }
        }
        for(int i=0;i<=Sem_top;i++)
            cout << SEM[i] << '\t';
    }
    else cout << "No" << endl;
}

void HandleE()
{
    HandleT();
    HandleA();
}

void HandleA()
{
    if(AnsToken[Syntax_top].target[0]=='+' || AnsToken[Syntax_top].target[0]=='-')
    {
        Syntax_top++;
        HandleT();
        HandleA();
    }
}

void HandleT()
{
    HandleF();
    HandleB();
}

void HandleB()
{
    if(AnsToken[Syntax_top].target[0]=='*' || AnsToken[Syntax_top].target[0]=='/')
    {
        Syntax_top++;
        HandleF();
        HandleB();
    }
}

void HandleF()
{
    if(AnsToken[Syntax_top].num==0 || AnsToken[Syntax_top].num==3)
    {
        Syntax_top++;
    }
    else if(AnsToken[Syntax_top].target[0]=='(')
    {
        Syntax_top++;
        HandleE();
        if(AnsToken[Syntax_top].target[0]==')')
        {
            Syntax_top++;
        }
    }
}

翻译文法法

文法1

Preset.h

#ifndef PRESET_H_INCLUDED
#define PRESET_H_INCLUDED

#define AnsNum 100010
#define AnsLen 110
#define TableNum 110
#define DeliNum 12
#define KeyNum 7

int consttop=0;
int identtop=0;
int cconsttop=0;
int sconsttop=0;
int top;

const int DelimeterNum=22;
const int Keynum=9;

//界符表
char Delimeters[TableNum][TableNum]={"(",")","<<","{","}",";","=","+","-","*","_","[","]",".","==","<=","<",">",">=",",","/","\""}; //i+4
//关键字表
char Key[TableNum][TableNum]={"int", "main", "void", "if", "else", "char", "cout","double","float"};    //i+26
//字符常数表
char Char_Constant[TableNum];
//字符串常数表
char String_Constant[TableNum][TableNum];
//常数表
char Constant[TableNum][TableNum];
//符号表总表(SYNBL)
char Identifier[TableNum][TableNum];

std::string Str;
int Syntax_top;

void Handle();
void HandleE();
void HandleT();
void HandleF();


#endif // PRESET_H_INCLUDED

main.c

#include <iostream>
#include <cstring>
#include <windows.h>
#include <cstdio>
#include "Preset.h"

using namespace std;

typedef struct token
{
    char target[AnsLen];
    int num;    //Token类别 Identifier——0 Char_Constant——1 String_Constant——2 Constant——3 Key——4...25 Delimeters——26...34
}Token;

Token AnsToken[AnsNum];

int main()
{
    top=0;
    char TempToken[AnsNum];
    int TempTop=0;
    bool quotation=false;

    freopen("input.c","r",stdin);
    freopen("output.c","w",stdout);

    while(cin >> Str)   //输入源代码
    {
        if(Str[0]=='#')break;
        for(int p=0;Str[p]!='#';)
        {
            if(Str[p]==' ')
            {
                p++;
                continue;
            }
            //判断标识符
            else if(Str[p]=='_' || isalpha(Str[p]))
            {
                for(;Str[p]!=0 && Str[p]!=' ';p++)  //结束标志-1即为0或者' '
                {
                    if(Str[p]=='_' || isalpha(Str[p]) || isdigit(Str[p]))
                    {
                        TempToken[TempTop++]=Str[p];
                    }
                    else
                    {
                        break;
                    }
                }
                //给AnsToken.target赋值
                strcpy(AnsToken[top].target,TempToken);
                //查找关键字
                for(int i=0;i<Keynum;i++)
                {
                    if(!strcmp(TempToken,Key[i]))
                    {
                        //给AnsToken.num赋值
                        AnsToken[top].num=i+26;
                        break;
                    }
                }
                //如果不是关键字,查找标识符表
                if(AnsToken[top].num<26)
                {
                    AnsToken[top].num=26;//标识符为0
                    for(int i=0;i<identtop;i++)
                    {
                        if(!strcmp(TempToken,Identifier[i]))
                        {
                            //给AnsToken.num赋值
                            AnsToken[top].num=0;
                            break;
                        }
                    }
                    if(AnsToken[top].num)
                    {
                        AnsToken[top].num=0;
                        strcpy(Identifier[identtop++],TempToken);
                    }
                }
                //清空TempToken
                TempTop=0;
                memset(TempToken,0,sizeof(TempToken));
                top++;
            }
            else if(isdigit(Str[p]))    //只能识别常数
            {
                bool Point=false;
                for(;Str[p]!=0 && Str[p]!=' ';p++)  //结束标志-1即为0或者' '
                {
                    if(isdigit(Str[p]))
                    {
                        TempToken[TempTop++]=Str[p];
                    }
                    else if(Str[p]=='.')
                    {
                        if(!Point)
                        {
                            TempToken[TempTop++]=Str[p];
                            Point=true;
                        }
                        else
                        {
                            putchar(7);
                            cout << "Compile Error!!!!!" << endl;
                            cout << "Wrong number." << endl;
                            exit(0xffffffff);
                        }
                    }
                    else
                    {
                        break;
                    }
                }
                //给AnsToken.target赋值
                strcpy(AnsToken[top].target,TempToken);
                //查找常数表
                for(int i=0;i<identtop;i++)
                {
                    if(!strcmp(TempToken,Constant[i]))
                    {
                        //给AnsToken.num赋值
                        AnsToken[top].num=3;
                        break;
                    }
                }
                if(AnsToken[top].num!=3)
                {
                    AnsToken[top].num=3;
                    strcpy(Constant[consttop++],TempToken);
                }
                //清空TempToken
                TempTop=0;
                memset(TempToken,0,sizeof(TempToken));
                top++;
            }
            else if(Str[p]==' ')
            {
                p++;
            }
            else if(Str[p]=='\'')
            {
                quotation=!quotation;
                TempToken[TempTop]=Str[p];
                strcpy(AnsToken[top].target,TempToken);
                AnsToken[top++].num=24;

                TempToken[TempTop]=Str[++p];
                strcpy(AnsToken[top].target,TempToken);
                for(int i=0;i<cconsttop;i++)
                {
                    if(TempToken[0]==Char_Constant[i])
                    {
                        AnsToken[top].num=1;
                    }
                }
                if(AnsToken[top].num!=1)
                {
                    AnsToken[top].num=1;
                    Char_Constant[cconsttop++]=TempToken[0];
                }
                top++;

                if(Str[p+1]!='\'')
                {
                    putchar(7);
                    cout << "Compile Error!!!!!" << endl;
                    cout << "Wrong Character." << endl;
                    exit(0xffffffff);
                }
                else
                {
                    p++;
                    quotation=!quotation;
                    TempToken[TempTop]=Str[p];
                    strcpy(AnsToken[top].target,TempToken);
                    AnsToken[top++].num=24;
                    TempToken[0]=0;
                    p++;
                }
            }
            else if(Str[p]=='\"')
            {
                quotation=!quotation;
                TempToken[TempTop]=Str[p];
                strcpy(AnsToken[top].target,TempToken);
                AnsToken[top++].num=25;
                p++;

                //识别字符串常量
                while(Str[p]!='\"')
                {
                    if(Str[p]=='#')
                    {
                        putchar(7);
                        cout << "Compile Error!!!!!" << endl;
                        cout << "Wrong Character." << endl;
                        exit(0xffffffff);
                    }
                    TempToken[TempTop++]=Str[p];
                    p++;
                }

                strcpy(AnsToken[top].target,TempToken);
                for(int i=0;i<sconsttop;i++)
                {
                    if(strcmp(!TempToken,String_Constant[i]))
                    {
                        AnsToken[top].num=2;
                    }
                }
                if(AnsToken[top].num!=2)
                {
                    AnsToken[top].num=2;
                    strcpy(String_Constant[sconsttop++],TempToken);
                }
                top++;

                //清空TempToken
                TempTop=0;
                memset(TempToken,0,sizeof(TempToken));

                quotation=!quotation;
                TempToken[TempTop]=Str[p];
                strcpy(AnsToken[top].target,TempToken);
                AnsToken[top++].num=25;
                //清空TempToken
                TempTop=0;
                memset(TempToken,0,sizeof(TempToken));
                p++;
            }
            else if((Str[p]=='<' && (Str[p+1]=='<' || Str[p+1]=='=')) || ((Str[p]=='>' || Str[p]=='=') && Str[p+1]=='='))
            {
                TempToken[0]=Str[p++];
                TempToken[1]=Str[p++];
                TempToken[2]=0;

                //给AnsToken.target赋值
                strcpy(AnsToken[top].target,TempToken);
                //查找界符表
                for(int i=0;i<DelimeterNum;i++)
                {
                    if(!strcmp(TempToken,Delimeters[i]))
                    {
                        //给AnsToken.num赋值
                        AnsToken[top].num=i+4;
                        break;
                    }
                }

                //清空TempToken
                TempTop=0;
                memset(TempToken,0,sizeof(TempToken));
                top++;
            }
            else
            {
                //识别单目运算符
                if(Str[p]!=0 && Str[p]!=' ' && !isalpha(Str[p]) && !isdigit(Str[p]) && Str[p]!='_' && Str[p]!='#')  //结束标志-1即为0或者' '
                {
                    TempToken[TempTop++]=Str[p++];
                }
                else
                {
                   break;
                }
                TempToken[TempTop]=0;
                for(int j=0;j<DelimeterNum;j++)
                {
                    if(!strcmp(TempToken,Delimeters[j]))
                    {
                        strcpy(AnsToken[top].target,TempToken);
                        AnsToken[top++].num=j+4;
                        break;
                    }
                }
                TempTop=0;
            }
        }
    }
    AnsToken[top].target[0]='#';
    AnsToken[top++].num=-1;
    for(int i=0;i<top;i++)
        cout << "< " << AnsToken[i].target << " , " << AnsToken[i].num << " >" << endl;
    Handle();
    return 0;
}

void Handle()
{
    Syntax_top=0;
    HandleE();
    cout << endl;
    if(AnsToken[Syntax_top].target[0]=='#')
        cout << "Yes" << endl;
    else cout << "No" << endl;
}

void HandleE()
{
    HandleT();
    while(AnsToken[Syntax_top].target[0]=='+' || AnsToken[Syntax_top].target[0]=='-')
    {
        if(AnsToken[Syntax_top].target[0]=='+' )
        {
            Syntax_top++;
            HandleT();
            cout << '+' << '\t';
        }
        else if(AnsToken[Syntax_top].target[0]=='-')
        {
            Syntax_top++;
            HandleT();
            cout << '-' << '\t';
        }
    }
}


void HandleT()
{
    HandleF();
    while(AnsToken[Syntax_top].target[0]=='*' || AnsToken[Syntax_top].target[0]=='/')
    {
        if(AnsToken[Syntax_top].target[0]=='*' )
        {
            Syntax_top++;
            HandleT();
            cout << '*' << '\t';
        }
        else if(AnsToken[Syntax_top].target[0]=='/')
        {
            Syntax_top++;
            HandleT();
            cout << '/' << '\t';
        }
    }
}

void HandleF()
{
    if(AnsToken[Syntax_top].num==0 || AnsToken[Syntax_top].num==3)
    {
        cout << AnsToken[Syntax_top].target << '\t';
        Syntax_top++;
    }
    else if(AnsToken[Syntax_top].target[0]=='(')
    {
        Syntax_top++;
        HandleE();
        if(AnsToken[Syntax_top].target[0]==')')
            Syntax_top++;
    }
}

文法2

Preset.h

#ifndef PRESET_H_INCLUDED
#define PRESET_H_INCLUDED

#define AnsNum 100010
#define AnsLen 110
#define TableNum 110
#define DeliNum 12
#define KeyNum 7

int consttop=0;
int identtop=0;
int cconsttop=0;
int sconsttop=0;
int top;

const int DelimeterNum=22;
const int Keynum=9;

//界符表
char Delimeters[TableNum][TableNum]={"(",")","<<","{","}",";","=","+","-","*","_","[","]",".","==","<=","<",">",">=",",","/","\""}; //i+4
//关键字表
char Key[TableNum][TableNum]={"int", "main", "void", "if", "else", "char", "cout","double","float"};    //i+26
//字符常数表
char Char_Constant[TableNum];
//字符串常数表
char String_Constant[TableNum][TableNum];
//常数表
char Constant[TableNum][TableNum];
//符号表总表(SYNBL)
char Identifier[TableNum][TableNum];

std::string Str;
int Syntax_top;

void Handle();
void HandleE();
void HandleA();
void HandleT();
void HandleB();
void HandleF();

#endif // PRESET_H_INCLUDED

main.c

#include <iostream>
#include <cstring>
#include <windows.h>
#include <cstdio>
#include "Preset.h"

using namespace std;

typedef struct token
{
    char target[AnsLen];
    int num;    //Token类别 Identifier——0 Char_Constant——1 String_Constant——2 Constant——3 Key——4...25 Delimeters——26...34
}Token;

Token AnsToken[AnsNum];

int main()
{
    top=0;
    char TempToken[AnsNum];
    int TempTop=0;
    bool quotation=false;

    freopen("input.c","r",stdin);
    freopen("output.c","w",stdout);

    while(cin >> Str)   //输入源代码
    {
        if(Str[0]=='#')break;
        for(int p=0;Str[p]!='#';)
        {
            if(Str[p]==' ')
            {
                p++;
                continue;
            }
            //判断标识符
            else if(Str[p]=='_' || isalpha(Str[p]))
            {
                for(;Str[p]!=0 && Str[p]!=' ';p++)  //结束标志-1即为0或者' '
                {
                    if(Str[p]=='_' || isalpha(Str[p]) || isdigit(Str[p]))
                    {
                        TempToken[TempTop++]=Str[p];
                    }
                    else
                    {
                        break;
                    }
                }
                //给AnsToken.target赋值
                strcpy(AnsToken[top].target,TempToken);
                //查找关键字
                for(int i=0;i<Keynum;i++)
                {
                    if(!strcmp(TempToken,Key[i]))
                    {
                        //给AnsToken.num赋值
                        AnsToken[top].num=i+26;
                        break;
                    }
                }
                //如果不是关键字,查找标识符表
                if(AnsToken[top].num<26)
                {
                    AnsToken[top].num=26;//标识符为0
                    for(int i=0;i<identtop;i++)
                    {
                        if(!strcmp(TempToken,Identifier[i]))
                        {
                            //给AnsToken.num赋值
                            AnsToken[top].num=0;
                            break;
                        }
                    }
                    if(AnsToken[top].num)
                    {
                        AnsToken[top].num=0;
                        strcpy(Identifier[identtop++],TempToken);
                    }
                }
                //清空TempToken
                TempTop=0;
                memset(TempToken,0,sizeof(TempToken));
                top++;
            }
            else if(isdigit(Str[p]))    //只能识别常数
            {
                bool Point=false;
                for(;Str[p]!=0 && Str[p]!=' ';p++)  //结束标志-1即为0或者' '
                {
                    if(isdigit(Str[p]))
                    {
                        TempToken[TempTop++]=Str[p];
                    }
                    else if(Str[p]=='.')
                    {
                        if(!Point)
                        {
                            TempToken[TempTop++]=Str[p];
                            Point=true;
                        }
                        else
                        {
                            putchar(7);
                            cout << "Compile Error!!!!!" << endl;
                            cout << "Wrong number." << endl;
                            exit(0xffffffff);
                        }
                    }
                    else
                    {
                        break;
                    }
                }
                //给AnsToken.target赋值
                strcpy(AnsToken[top].target,TempToken);
                //查找常数表
                for(int i=0;i<identtop;i++)
                {
                    if(!strcmp(TempToken,Constant[i]))
                    {
                        //给AnsToken.num赋值
                        AnsToken[top].num=3;
                        break;
                    }
                }
                if(AnsToken[top].num!=3)
                {
                    AnsToken[top].num=3;
                    strcpy(Constant[consttop++],TempToken);
                }
                //清空TempToken
                TempTop=0;
                memset(TempToken,0,sizeof(TempToken));
                top++;
            }
            else if(Str[p]==' ')
            {
                p++;
            }
            else if(Str[p]=='\'')
            {
                quotation=!quotation;
                TempToken[TempTop]=Str[p];
                strcpy(AnsToken[top].target,TempToken);
                AnsToken[top++].num=24;

                TempToken[TempTop]=Str[++p];
                strcpy(AnsToken[top].target,TempToken);
                for(int i=0;i<cconsttop;i++)
                {
                    if(TempToken[0]==Char_Constant[i])
                    {
                        AnsToken[top].num=1;
                    }
                }
                if(AnsToken[top].num!=1)
                {
                    AnsToken[top].num=1;
                    Char_Constant[cconsttop++]=TempToken[0];
                }
                top++;

                if(Str[p+1]!='\'')
                {
                    putchar(7);
                    cout << "Compile Error!!!!!" << endl;
                    cout << "Wrong Character." << endl;
                    exit(0xffffffff);
                }
                else
                {
                    p++;
                    quotation=!quotation;
                    TempToken[TempTop]=Str[p];
                    strcpy(AnsToken[top].target,TempToken);
                    AnsToken[top++].num=24;
                    TempToken[0]=0;
                    p++;
                }
            }
            else if(Str[p]=='\"')
            {
                quotation=!quotation;
                TempToken[TempTop]=Str[p];
                strcpy(AnsToken[top].target,TempToken);
                AnsToken[top++].num=25;
                p++;

                //识别字符串常量
                while(Str[p]!='\"')
                {
                    if(Str[p]=='#')
                    {
                        putchar(7);
                        cout << "Compile Error!!!!!" << endl;
                        cout << "Wrong Character." << endl;
                        exit(0xffffffff);
                    }
                    TempToken[TempTop++]=Str[p];
                    p++;
                }

                strcpy(AnsToken[top].target,TempToken);
                for(int i=0;i<sconsttop;i++)
                {
                    if(strcmp(!TempToken,String_Constant[i]))
                    {
                        AnsToken[top].num=2;
                    }
                }
                if(AnsToken[top].num!=2)
                {
                    AnsToken[top].num=2;
                    strcpy(String_Constant[sconsttop++],TempToken);
                }
                top++;

                //清空TempToken
                TempTop=0;
                memset(TempToken,0,sizeof(TempToken));

                quotation=!quotation;
                TempToken[TempTop]=Str[p];
                strcpy(AnsToken[top].target,TempToken);
                AnsToken[top++].num=25;
                //清空TempToken
                TempTop=0;
                memset(TempToken,0,sizeof(TempToken));
                p++;
            }
            else if((Str[p]=='<' && (Str[p+1]=='<' || Str[p+1]=='=')) || ((Str[p]=='>' || Str[p]=='=') && Str[p+1]=='='))
            {
                TempToken[0]=Str[p++];
                TempToken[1]=Str[p++];
                TempToken[2]=0;

                //给AnsToken.target赋值
                strcpy(AnsToken[top].target,TempToken);
                //查找界符表
                for(int i=0;i<DelimeterNum;i++)
                {
                    if(!strcmp(TempToken,Delimeters[i]))
                    {
                        //给AnsToken.num赋值
                        AnsToken[top].num=i+4;
                        break;
                    }
                }

                //清空TempToken
                TempTop=0;
                memset(TempToken,0,sizeof(TempToken));
                top++;
            }
            else
            {
                //识别单目运算符
                if(Str[p]!=0 && Str[p]!=' ' && !isalpha(Str[p]) && !isdigit(Str[p]) && Str[p]!='_' && Str[p]!='#')  //结束标志-1即为0或者' '
                {
                    TempToken[TempTop++]=Str[p++];
                }
                else
                {
                   break;
                }
                TempToken[TempTop]=0;
                for(int j=0;j<DelimeterNum;j++)
                {
                    if(!strcmp(TempToken,Delimeters[j]))
                    {
                        strcpy(AnsToken[top].target,TempToken);
                        AnsToken[top++].num=j+4;
                        break;
                    }
                }
                TempTop=0;
            }
        }
    }
    AnsToken[top].target[0]='#';
    AnsToken[top++].num=-1;
    for(int i=0;i<top;i++)
        cout << "< " << AnsToken[i].target << " , " << AnsToken[i].num << " >" << endl;
    Handle();
    return 0;
}

void Handle()
{
    Syntax_top=0;
    HandleE();
    cout << endl;
    if(AnsToken[Syntax_top].target[0]=='#')
        cout << "Yes" << endl;
    else 
        cout << "No" << endl;
}

void HandleE()
{
    HandleT();
    HandleA();
}

void HandleA()
{
    if(AnsToken[Syntax_top].target[0]=='+' || AnsToken[Syntax_top].target[0]=='-')
    {
        char temp=AnsToken[Syntax_top].target[0];
        Syntax_top++;
        HandleT();
        HandleA();
        cout << temp << '\t';
    }
}

void HandleT()
{
    HandleF();
    HandleB();
}

void HandleB()
{
    if(AnsToken[Syntax_top].target[0]=='*' || AnsToken[Syntax_top].target[0]=='/')
    {
        char temp=AnsToken[Syntax_top].target[0];
        Syntax_top++;
        HandleF();
        HandleB();
        cout << temp << '\t';
    }
}

void HandleF()
{
    if(AnsToken[Syntax_top].num==0 || AnsToken[Syntax_top].num==3)
    {
        cout << AnsToken[Syntax_top].target << '\t';
        Syntax_top++;
    }
    else if(AnsToken[Syntax_top].target[0]=='(')
    {
        Syntax_top++;
        HandleE();
        if(AnsToken[Syntax_top].target[0]==')')
        {
            Syntax_top++;
        }
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值