編譯原理實驗一詞法分析器,並實現文件讀入和輸出
#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;
}
}
}