编译原理实验一词法分析器,并实现文件读入和输出
#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;
}
}
}