編譯原理實驗一詞法分析器

編譯原理實驗一詞法分析器,並實現文件讀入和輸出 

#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;
        }
    }


}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章