编译原理之扫描器

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 main()
{
    int a=0;
    int b=123;
    int c=a<b?41:2;
    cout << c << endl;
    return 0;
}*/

int consttop=0;
int identtop=0;

const int DelimeterNum=11;
const int Keynum=7;

char Delimeters[TableNum][TableNum]={"(",")","<<","{","}",";","=","+","-","*","/"}; //3-13  i+3
char Key[TableNum][TableNum]={"int","main","cout","endl","return","char","cin"};    //14-20 i+14
char Constant[TableNum][TableNum];
char Identifier[TableNum][TableNum];

#endif // PRESET_H_INCLUDED

main.cpp

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

using namespace std;

typedef struct token
{
    char target[AnsLen];
    int num;    //Token类别 Identifier——1 Constant——2 Key——3 Delimeters——4
}Token;

Token AnsToken[AnsNum];

int main()
{
    string Str;
    int top=0;
    char temp[100];
    while(cin >> Str)   //输入源代码
    {
        int Ttop=0;
        for(int i=0;Str[i]!=0;)
        {
            //判断标识符
            if(Str[i]=='_' || isalpha(Str[i]))
            {
                for(;Str[i]!=0 && Str[i]!=' ';i++)  //结束标志-1即为0或者' '
                {
                    if(Str[i]=='_' || isalpha(Str[i]) || isdigit(Str[i]))
                    {
                        temp[Ttop++]=Str[i];
                    }
                    else
                    {
                        break;
                    }
                }
                temp[Ttop]=0;
                strcpy(AnsToken[top].target,temp);
                AnsToken[top].num=1;
                Ttop=0;
                //判断是不是关键字
                int flag=1;
                for(int j=0;j<KeyNum;j++)
                {
                    if(strcmp(temp,Key[j])==0)
                    {
                        AnsToken[top].num=j+14;
                        flag=0;
                        break;
                    }
                }
                top++;
                if(flag)
                {
                    strcpy(Identifier[identtop++],temp);
                }
            }
            else if(isdigit(Str[i]))    //只能识别常数
            {
                for(;Str[i]!=0 && Str[i]!=' ';i++)  //结束标志-1即为0或者' '
                {
                    if(isdigit(Str[i]))
                    {
                        temp[Ttop++]=Str[i];
                    }
                    else
                    {
                        break;
                    }
                }
                temp[Ttop]=0;
                strcpy(AnsToken[top].target,temp);
                AnsToken[top++].num=2;
                strcpy(Constant[consttop++],temp);
            }
            else if(Str[i]==' ')
            {
                i++;
            }
            else
            {
                //无法识别三目运算符
                for(;Str[i]!=0 && Str[i]!=' ' && !isalpha(Str[i]) && !isdigit(Str[i]) && Str[i]!='_';i++)  //结束标志-1即为0或者' '
                {
                    temp[Ttop++]=Str[i];
                }
                temp[Ttop]=0;
                for(int j=0;j<DelimeterNum;j++)
                {
                    if(strcmp(temp,Delimeters[j])==0)
                    {
                        strcpy(AnsToken[top].target,temp);
                        AnsToken[top++].num=j+3;
                        break;
                    }
                }
                Ttop=0;
            }
        }
    }
    for(int i=0;i<top;i++)
        cout << "< " << AnsToken[i].target << " , " << AnsToken[i].num << " >" << endl;
    return 0;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值