编译原理实验一词法分析器

编译原理实验一词法分析器,并实现文件读入和输出 

#include<iostream>
#include<cstring>
#include<memory.h>
#include<stdlib.h>
#include<fstream>
using namespace std;

int isLetter(char ch){//判断是否是字母
 if(ch>='a'&&ch<='z'||ch>='A'&&ch<='Z'){
    return 1;
 }
 return 0;
}

int isDigit(char ch){//判断是否是数字
 if(ch>='0'&&ch<='9'){
    return 1;
 }
 return 0;
}

int isDelimiter(char ch){//判断是否是界符
 if(ch=='('||ch==')'||ch==','||ch==';'||ch=='.'||ch=='{'||ch=='}'){
    return 1;
 }
 return 0;
}

int isOperators(char ch){//判断是否是运算符
 if(ch=='+'||ch=='-'||ch=='*'||ch=='/'||ch=='='||ch=='#'||ch=='<'||ch=='>'||ch==':'){
    return 1;
 }
 return 0;
}

int isNo_use(char ch){//判断是否是无用符号
 if(ch==' '||ch=='\n'||ch=='\t'){
    return 1;
 }
 return 0;
}

char key_word[14][12]={"const","var", "procedure", "begin", "end", "odd", "then", "call"
, "while", "if", "do", "read", "write","tianwenbiao"
};

int main(){
    char resourceProject[1000];
    int pProject = 0;
    FILE *fp,*fp1;
    if((fp = fopen("data.txt","r")) == NULL){//输入内容文件
        cout<<"Can't find this file"<<endl;
        exit(0);
    }
    if((fp1 = fopen("output.txt","w+")) == NULL){//存放输出的文件
        cout<<"Can't find this file"<<endl;
        exit(0);
    }
    resourceProject[pProject] = fgetc(fp);
    while(resourceProject[pProject] != '#'){
        pProject++;
        resourceProject[pProject] = fgetc(fp);
    }
    resourceProject[++pProject]='\0';
    fclose(fp);
    int i=0,j,flag;
    while(resourceProject[i]!='#'){
        if(isNo_use(resourceProject[i]))
             i++;
        else if(isLetter(resourceProject[i])){
            char a[15]="";
            //memset(a,'0',sizeof(a));
            int k=0;
            do{
                    a[k]=resourceProject[i];
                    k++;
                    i++;
            }while(isDigit(resourceProject[i])||isLetter(resourceProject[i]));
            for(int i=0;i<14;i++){
                if(strcmp(a,key_word[i])==0){
                    flag=1;
                    break;
                }
                else{
                    flag=0;
                }
            }
            if(flag==1){
                printf("%-14s关键字\n",a);
                fprintf(fp1,"%-14s关键字\n",a);
            }
            else {
                printf("%-14s标识符\n",a);
                fprintf(fp1,"%-14s标识符\n",a);
            }
        }
        else if(isDigit(resourceProject[i])){
            char Digit[10] = "";
            int k=0;
            while(isDigit(resourceProject[i])){
            Digit[k] = resourceProject[i];
            i++;
            k++;
           }
            printf("%-14s数字\n",Digit);
            fprintf(fp1,"%-14s数字\n",Digit);
        }
        else if(isDelimiter(resourceProject[i])){
            printf("%-14c界符\n",resourceProject[i]);
            fprintf(fp1,"%-14c界符\n",resourceProject[i]);
            i+=1;
        }
        else if(isOperators(resourceProject[i])){
            if(resourceProject[i]==':'&&resourceProject[i+1]=='='){
                printf("%c%-13c运算符\n",resourceProject[i],resourceProject[i+1]);
                fprintf(fp1,"%c%-13c运算符\n",resourceProject[i],resourceProject[i+1]);
                i+=2;
             }
           else if(resourceProject[i]=='<'){
                if(resourceProject[i+1]=='='){
                   printf("%c%-13c运算符\n",resourceProject[i],resourceProject[i+1]);
                fprintf(fp1,"%c%-13c运算符\n",resourceProject[i],resourceProject[i+1]);
                     i+=2;
                }
                else {
                    printf("%-14c运算符\n",resourceProject[i]);
                fprintf(fp1,"%-14c运算符\n",resourceProject[i]);
                    i+=1;
                }
            }
            else if(resourceProject[i]=='>'){
                if(resourceProject[i+1]=='='){
                   printf("%c%-13c运算符\n",resourceProject[i],resourceProject[i+1]);
                fprintf(fp1,"%c%-13c运算符\n",resourceProject[i],resourceProject[i+1]);
                 i+=2;
                }
                else {
                    printf("%-14c运算符\n",resourceProject[i]);
                fprintf(fp1,"%-14c运算符\n",resourceProject[i]);
                    i+=1;
                }
            }
            else if(resourceProject[i]=='+'){
                printf("%-14c运算符\n",resourceProject[i]);
                fprintf(fp1,"%-14c运算符\n",resourceProject[i]);
                 i+=1;
            }
            else if(resourceProject[i]=='-'){
                 printf("%-14c运算符\n",resourceProject[i]);
                fprintf(fp1,"%-14c运算符\n",resourceProject[i]);
                i+=1;
            }
            else if(resourceProject[i]=='*'){
                 printf("%-14c运算符\n",resourceProject[i]);
                fprintf(fp1,"%-14c运算符\n",resourceProject[i]);
                i+=1;
            }
            else if(resourceProject[i]=='/'){
                printf("%-14c运算符\n",resourceProject[i]);
                fprintf(fp1,"%-14c运算符\n",resourceProject[i]);
                i+=1;
            }
        }
        else {
            cout<<"输入错误"<<endl;
        }
    }


}
发布了69 篇原创文章 · 获赞 50 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/qq873044564/article/details/89814588