编译原理:词法分析

先粘个代码,之后完善

#include<iostream>
#include<fstream>
#include<cstring>
using namespace std;
char Filename[30];  //文件名
FILE *fpin;   //声明一个函数指针
char ch,prog[1000],token[8];
char *keyword[8]={(char*)"if",(char*)"then",(char*)"else",(char*)"end",(char*)"repeat",(char*)"until",(char*)"read",(char*)"write"};
int p=0,symbol=0,n;
/*  symbol表
    0->  字母  -> 1 -> 其他 -> 2
         if   -> 3
         then -> 4
         else -> 5
         end  -> 6
         repeat -> 7
         until -> 8
         read -> 9
         write -> 10
         数字  -> 11 -> 其他 -> 12
         + -> 13
         - -> 14
         * -> 15
         / -> 16
         = -> 17
         < -> 18
         ; -> 19
*/
void GetToken()   //词法分析
{
    for(n=0;n<8;n++){
        token[n]='\0';
    }
    n=0;
    ch=prog[p++];
    while(ch==' '||ch=='\n'||ch=='\t'){ch=prog[p++];}  //跳过空格,换行符,制表符
    if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')){
        symbol=1;
        do{  //在token中记录单词
            token[n++]=ch;
            ch=prog[p++];
        }while((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'));

        symbol=2;
        for(n=0;n<8;n++){
            if(strcmp(token,keyword[n])==0){  //判断token是否为保留字
                symbol=n+3;
            }
        }
        p--;
    }
    else if(ch=='{'){
        do{
            ch=prog[p++];
        }while(ch!='}');
        symbol=-1;
        return;
    }
    else if(ch>='0'&&ch<='9'){
        symbol=11;
        do{
            token[n++]=ch;
            ch=prog[p++];
        }while(ch>='0'&&ch<='9');

        symbol=12;
        p--;
        return;
    }
    else{
        switch(ch)
        {
            case '+':symbol=13;token[0]=ch;break;
            case '-':symbol=14;token[0]=ch;break;
            case '*':symbol=15;token[0]=ch;break;
            case '/':symbol=16;token[0]=ch;break;
            case '=':symbol=17;token[0]=ch;break;
            case '<':symbol=18;token[0]=ch;break;
            case ';':symbol=19;token[0]=ch;break;
            default: symbol=-2;cout<<"词法分析出错,请检查是否输入非法字符!\n";break;
        }
    }
}

int main(void){
    /*读入文件*/
    cout<<"请输入源文件名:";
    for(;;){
        cin>>Filename;
        int temp=0;
        while(Filename[temp]!='\0'){
            temp++;
        }  
        if((fpin=fopen(Filename,"r"))!=NULL)
            break;
        else 
            cout<<"文件路径错误!请重新输入源文件名:";
    }
    /*将文件内容存入字符串prog*/
    p=0;
    do{
        ch=fgetc(fpin);
        prog[p++]=ch;
    }while(ch!=EOF);

    
    ofstream outFile;
    outFile.open("C:\\Users\\45312\\Documents\\lex.txt");   //存储输出文件的位置

    p=0;  
    do{
        GetToken();   //词法分析
        switch(symbol)
        {
            case -1:
            case -2:break;
            default:outFile<<"("<<symbol<<","<<token<<")"<<endl;  break;
        }
    }while(ch!=EOF);

    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值