📄 c_compile.cpp
字号:
#include<stdio.h>
#include<iostream.h>
#include<string.h>
#include<ctype.h>
#include<process.h>
void lookup(char *p);
void wordanalysis();
void program();
void mid_list();
void declaration();
void declaration1();
void type_specifier();
void params();
void param1();
void param();
void compound_stmt();
void local_declarations();
void statement_list();
void statement();
void evaluate_stmt();
void selection_stmt();
void select1();
void iteration_stmt();
void E();
void simple1();
void relop();
void additive_expression();
void term1();
void addop();
void term();
void factor1();
void mulop();
void factor();
#define NUM 100
struct
{
char symbol[30];
int classID;
}keywordtable[33]={"+",3,"-",4,"*",5,"/",6,"<",7,"<=",8,"==",9,"!=",10,">",11,
">=",12,"&",13,"&&",14,"||",15,"=",16,"(",17,")",18,"[",19,"]",20,"{",21,"}",22,
":",23,";",24,",",25,"void",26,"int",27,"float",28,"char",29,"if",30,"else",31,"while",32,
"do",33,"!",34,"main",35};
FILE *fp; //打开源文件
char ch;
int key_count=33;
int eryuanshi_count=0;
int sym_count=0;
int worknum=0;
int symID;
struct
{
char name[20];
int type; //0表示整数,1表示标识符
}symtable[NUM]; //符号表
struct
{
char sign[20];
int classID; //0表示整数,1表示标识符
}eryuanshi[NUM];
//查询符号链表或关键字链表
void lookup(char *p)
{
int i,j,num=0;
for(i=0;i<key_count;i++)
if(strcmp(keywordtable[i].symbol,p)==0)
{
strcpy(eryuanshi[eryuanshi_count].sign,p);
eryuanshi[eryuanshi_count++].classID=keywordtable[i].classID;
break;
}
if(i==key_count) //没找着,再找符号表
{
for(j=0;j<sym_count;j++)
{
if(strcmp(symtable[j].name,p)==0)
{
strcpy(eryuanshi[eryuanshi_count].sign,p);
eryuanshi[eryuanshi_count++].classID=symtable[j].type;
break;
}
}
if(j==sym_count) //在符号表中没找着
{
strcpy(symtable[sym_count].name,p);
if(isdigit(*p))
symtable[sym_count++].type=0; //整数
else
symtable[sym_count++].type=1; //字符串
strcpy(eryuanshi[eryuanshi_count].sign,p);
eryuanshi[eryuanshi_count++].classID=symtable[sym_count-1].type;
}
}
}
void wordanalysis()
{
char word[20];
int status=0,k=0;
while(1)
{
switch(status)
{
case 0:
switch(ch)
{
case '<':
status=6;
k=0;
word[k++]=ch;
ch=fgetc(fp);
break;
case '=':
status=7;
k=0;
word[k++]=ch;
ch=fgetc(fp);
break;
case '>':
status=8;
k=0;
word[k++]=ch;
ch=fgetc(fp);
break;
case '+':
case '-':
case '*':
case '(':
case ')':
case '[':
case ']':
case '{':
case '}':
case ':':
case ';':
case ',':
k=0;
word[k++]=ch;
ch=fgetc(fp);
status=2;
break;
case '/':
status=9;
k=0;
word[k++]=ch;
ch=fgetc(fp);
break;
case '!':
status=13;
k=0;
word[k++]=ch;
ch=fgetc(fp);
break;
case '&':
status=14;
k=0;
word[k++]=ch;
ch=fgetc(fp);
break;
case '|':
status=15;
k=0;
word[k++]=ch;
ch=fgetc(fp);
break;
case EOF:
return;
default:
if(isalpha(ch)||ch=='_')
{
status=1;
k=0;
word[k++]=ch;
ch=fgetc(fp);
}
else if(isdigit(ch))
{
status=3;
k=0;
word[k++]=ch;
ch=fgetc(fp);
}
else
ch=fgetc(fp);
break;
}
break;
case 1:
if(isalpha(ch)||isdigit(ch)||ch=='_')
{
word[k++]=ch;
ch=fgetc(fp);
}else
status=2;
break;
case 2:
word[k]='\0';
lookup(word);
status=0;
break;
case 3:
if(isdigit(ch))
{
word[k++]=ch;
ch=fgetc(fp);
}
else if(ch=='.')
{
status=4;
word[k++]=ch;
ch=fgetc(fp);
}
else
status=2;
break;
case 4:
if(isdigit(ch))
{
status=5;
word[k++]=ch;
ch=fgetc(fp);
}else
{
cout<<"Error!\n";
return;
}
break;
case 5:
if(isdigit(ch))
{
word[k++]=ch;
ch=fgetc(fp);
}
else
status=2;
break;
case 6:
if(ch=='=')
{
word[k++]=ch;
ch=fgetc(fp);
status=2;
}
else
status=2;
break;
case 7:
if(ch=='=')
{
status=2;
word[k++]=ch;
ch=fgetc(fp);
}
else
status=2;
break;
case 8:
if(ch=='=')
{
status=2;
word[k++]=ch;
ch=fgetc(fp);
}
else
status=2;
break;
case 9:
if(ch=='*')
{
status=10;
ch=fgetc(fp);
}
else
status=2;
break;
case 10:
if(ch=='*')
{
status=11;
ch=fgetc(fp);
}
else
ch=fgetc(fp);
break;
case 11:
if(ch=='/')
{
status=12;
ch=fgetc(fp);
}
else if(ch=='*')
ch=fgetc(fp);
else
{
status=10;
ch=fgetc(fp);
}
break;
case 12:
status=0;
break;
case 13:
if(ch=='=')
{
word[k++]=ch;
status=2;
ch=fgetc(fp);
}else
status=2;
break;
case 14:
if(ch=='&')
{
word[k++]=ch;
status=2;
ch=fgetc(fp);
}else
status=2;
break;
case 15:
if(ch=='|')
{
word[k++]=ch;
status=2;
ch=fgetc(fp);
}else
status=2;
break;
}
}
}
void program()
{
declaration();
mid_list();
}
void mid_list()
{
if(symID==26||symID==27||symID==28||symID==29) //void int float char
{
declaration();
mid_list();
}
else if(worknum!=eryuanshi_count+1)
{
cout<<"应该以int,char,float或void开始说明全局变量或函数!\n";
return;
}
}
void declaration()
{
type_specifier();
if(symID==1 || symID==35) //ID
{
symID=eryuanshi[worknum++].classID;
declaration1();
}
else{
cout<<"类型关键字后应跟标识符!\n";
return;
}
}
void declaration1()
{
if(symID==24) //;
{
symID=eryuanshi[worknum++].classID;
return;
}
else if(symID==17) // 处理字符 (
{
symID=eryuanshi[worknum++].classID;
params();
if(symID==18) //处理字符 )
{
symID=eryuanshi[worknum++].classID;
compound_stmt();
}
else
{
cout<<"少了一个')'!\n";
return;
}
}
else
{
cout<<"少了一个'('或';'!\n";
return;
}
}
void type_specifier()
{
if(symID==26||symID==27||symID==28||symID==29)
symID=eryuanshi[worknum++].classID;
else
{
cout<<"应该有int,float,char或void!\n";
return;
}
}
void params()
{
if(symID==26||symID==27||symID==28||symID==29)
{
param();
param1();
}
else if(symID!=18)
{
cout<<"应该有')'\n";
return;
}
}
void param1()
{
if(symID==25) //,
{
symID=eryuanshi[worknum++].classID;
param();
param1();
}
else if(symID!=18)
{
cout<<"应该有')'\n";
return;
}
}
void param()
{
type_specifier();
if(symID==1)
symID=eryuanshi[worknum++].classID;
else
{
cout<<"应该有标识符\n";
return;
}
}
void compound_stmt()
{
if(symID==21) //{
{
symID=eryuanshi[worknum++].classID;
local_declarations();
statement_list();
if(symID==22) //}
symID=eryuanshi[worknum++].classID;
else
{
cout<<"'}' is expected!\n";
return;
}
}
else
{
cout<<"应该有'{'\n";
return;
}
}
void local_declarations()
{
if(symID==26||symID==27||symID==28||symID==29)
{
type_specifier();
if(symID==1)
symID=eryuanshi[worknum++].classID;
if(symID==24)
{
symID=eryuanshi[worknum++].classID;
}
local_declarations();
}
else if(symID!=24 && symID!=1 && symID!=21 && symID!=22
&& symID!=30 && symID!=32)
{
cout<<"缺少下列关键字或标识符:\";、ID、{、}、if、while\"\n";
return;
}
}
void statement_list()
{
if(symID==24 || symID==1 || symID==21 || symID==30 || symID==32)
{
statement();
statement_list();
}
else if(symID!=22)
{
cout<<"应该有'}'\n";
return;
}
}
void statement()
{
if(symID==1) //ID
evaluate_stmt();
else if(symID==21) //{
compound_stmt();
else if(symID==30) //if
selection_stmt();
else if(symID==32) //while
iteration_stmt();
else if(symID==24) //;
{
symID=eryuanshi[worknum++].classID;
}
else
{
cout<<"Expected:ID,{,if,while,;\n";
return;
}
}
void evaluate_stmt()
{
symID=eryuanshi[worknum++].classID;
if(symID==16)
{
symID=eryuanshi[worknum++].classID;
E();
if(symID==24)
symID=eryuanshi[worknum++].classID;
else
{
cout<<"';' is expected!\n";
return;
}
}
else
{
cout<<"'=' is expected!\n";
return;
}
}
void selection_stmt()
{
symID=eryuanshi[worknum++].classID;
if(symID==17) //(
{
symID=eryuanshi[worknum++].classID;
E();
if(symID==18) //)
{
symID=eryuanshi[worknum++].classID;
statement();
select1();
}else
{
cout<<"A ')' is expected!\n";
return;
}
}
else
{
cout<<"A '(' is expected!\n";
return;
}
}
void select1()
{
if(symID==31)
{
symID=eryuanshi[worknum++].classID;
statement();
}
else if(symID!=24 && symID!=1 && symID!=21 && symID!=22
&& symID!=30 && symID!=32)
{
cout<<"缺少下列关键字或标识符:\";、ID、{、}、if、while\"\n";
return;
}
}
void iteration_stmt()
{
symID=eryuanshi[worknum++].classID;
if(symID==17)
{
symID=eryuanshi[worknum++].classID;
E();
if(symID==18)
{
symID=eryuanshi[worknum++].classID;
statement();
}else
{
cout<<"A ')' is expected!\n";
return;
}
}
else
{
cout<<"A '(' is expected!\n";
return;
}
}
void E()
{
additive_expression();
simple1();
}
void simple1()
{
if(symID>=7 && symID<=12)
{
relop();
additive_expression();
}
else if(symID!=24 && symID!=18)
{
cout<<"')'or';' is expected!\n";
return;
}
}
void relop()
{
if(symID>=7 && symID<=12)
symID=eryuanshi[worknum++].classID;
}
void additive_expression()
{
term();
term1();
}
void term1()
{
if(symID==3 || symID==4)
{
addop();
term();
term1();
}
else if(symID!=7 && symID!=8 && symID!=9
&& symID!=10 && symID!=11 && symID!=12
&& symID!=18 && symID!=24)
{
cout<<"\"<、<=、>、、!=、>=、= =、)\" or';' is expected!\n";
return;
}
}
void addop()
{
if(symID==3 || symID==4)
symID=eryuanshi[worknum++].classID;
else
{
cout<<"'+'or'-' is expected!\n";
return;
}
}
void term()
{
factor();
factor1();
}
void factor1()
{
if(symID==5 || symID==6)
{
mulop();
factor();
factor1();
}
else if(symID!=7 && symID!=8 && symID!=9
&& symID!=10 && symID!=11 && symID!=12
&& symID!=18 && symID!=24 && symID!=3 && symID!=4)
{
cout<<"\"<、<=、>、>=、、!=、= =、)、+、-、\" or';' is expected!\n";
return;
}
}
void mulop()
{
if(symID==5 || symID==6)
symID=eryuanshi[worknum++].classID;
else
{
cout<<"'*'or'/' is expected!\n";
return;
}
}
void factor()
{
if(symID==17)
{
symID=eryuanshi[worknum++].classID;
E();
if(symID==18)
symID=eryuanshi[worknum++].classID;
else
{
cout<<"')' is expected!\n";
return;
}
}
else if(symID==1 || symID==0)
symID=eryuanshi[worknum++].classID;
else
{
cout<<"'(',ID or NUM is expected!\n";
return;
}
}
void main()
{
int i;
fp=fopen("input.txt","r"); //打开源文件
ch=fgetc(fp);
wordanalysis();
fclose(fp);
for(i=0;i<eryuanshi_count;i++)
cout<<eryuanshi[i].sign<<'\t'<<eryuanshi[i].classID<<endl;
symID=eryuanshi[worknum++].classID;
program();
worknum--;
if(worknum==eryuanshi_count)
cout<<"Successful!\n";
else
cout<<"Source is Wrong!\n";
fclose(fp);
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -