📄 main.c
字号:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <conio.h>
// STACK max value
#define MAXLENGTH 100
//FILE* fpDet = NULL;
int k = 1;
/*char inToken[100][100] = {"id","(",")",
"{","int","id",";","int","id",";","int","id",";",
"id","=","num",";","id","=","num",";","id","=","num",";",
"while","(","id","relop","id",")",
"{","id","=","id","addop","id",";","id","=","id","addop","num",";","}",
"if","(","id","relop","num",")",
"{","id","=","num",";","}",
"else","{","id","=","num",";","}","}","$"
};*/
char expression1[30][20] = {"Program","->","id","(",")","{","Slist","}"};
char expression2[30][20] = {"Slist","->","Dlist","Olist"};
char expression3[30][20] = {"Slist","->","Olist"};
char expression4[30][20] = {"Slist","->","&"};
char expression5[30][20] = {"Dlist","->","D","A'"};
char expression6[30][20] = {"A'","->","D","A'"};
char expression7[30][20] = {"A'","->","&"};
char expression8[30][20] = {"D","->","Type","id",";"};
char expression9[30][20] = {"Olist","->","O","B'"};
char expression10[30][20] = {"B'","->","O","B'"};
char expression11[30][20] = {"B'","->","&"};
char expression12[30][20] = {"O","->","id","=","Expression",";"};
char expression13[30][20] = {"O","->","while","(","Expression",")","{","Olist","}"};
char expression14[30][20] = {"O","->","if","(","Expression",")","{","Olist","}","E'"};
char expression15[30][20] = {"E'","->","else","{","Olist","}"};
char expression16[30][20] = {"E'","->","&"};
char expression17[30][20] = {"Expression","->","Simple_expression","F'"};
char expression18[30][20] = {"F'","->","relop","Simple_expression"};
char expression19[30][20] = {"F'","->","&"};
char expression20[30][20] = {"Simple_expression","->","Term","C'"};
char expression21[30][20] = {"C'","->","addop","Term","C'"};
char expression22[30][20] = {"C'","->","&"};
char expression23[30][20] = {"Term","->","Factor","D'"};
char expression24[30][20] = {"D'","->","mulop","Factor","D'"};
char expression25[30][20] = {"D'","->","&"};
char expression26[30][20] = {"Factor","->","id"};
char expression27[30][20] = {"Factor","->","num"};
char expression28[30][20] = {"Factor","->","(","Expression",")"};
char expression29[30][20] = {"Factor","->","!","Factor"};
char expression30[30][20] = {"Type","->","int"};
int anaTable[18][18] = {{-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
{-1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
{-1,3,-1,-1,-1,-1,-1,-1,-1,4,-1,3,-1,3,-1,-1,2,-1},
{-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,5,-1},
{-1,7,-1,-1,-1,-1,-1,-1,-1,-1,-1,7,-1,7,-1,-1,6,-1},
{-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,8,-1},
{-1,9,-1,-1,-1,-1,-1,-1,-1,-1,-1,9,-1,9,-1,-1,-1,-1},
{-1,12,-1,-1,-1,-1,-1,-1,-1,-1,-1,14,-1,13,-1,-1,-1,-1},
{-1,10,-1,-1,-1,-1,-1,-1,-1,11,-1,10,-1,10,-1,-1,-1,-1},
{-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,30,-1},
{-1,17,17,-1,-1,-1,17,-1,-1,-1,-1,-1,-1,-1,17,-1,-1,-1},
{-1,20,20,-1,-1,-1,20,-1,-1,-1,-1,-1,-1,-1,20,-1,-1,-1},
{-1,-1,-1,18,-1,-1,-1,19,-1,-1,19,-1,-1,-1,-1,-1,-1,-1},
{-1,23,23,-1,-1,-1,23,-1,-1,-1,-1,-1,-1,-1,23,-1,-1,-1},
{-1,-1,-1,22,21,-1,-1,22,-1,-1,22,-1,-1,-1,-1,-1,-1,-1},
{-1,26,27,-1,-1,-1,28,-1,-1,-1,-1,-1,-1,-1,29,-1,-1,-1},
{-1,-1,-1,25,25,24,-1,25,-1,-1,25,-1,-1,-1,-1,-1,-1,-1},
{-1,16,-1,-1,-1,-1,-1,-1,-1,16,-1,16,15,16,-1,-1,-1,-1}};
struct STACK{
int top;
char elements[MAXLENGTH][MAXLENGTH];
};
struct STACK st;
// Function declaration
void makeNull(struct STACK * s);
int top(struct STACK * s);
void pop(struct STACK * s);
void push(char * x,struct STACK * s);
int indenT(char * t);
void error(char *m);
void parse();
/*定义关键字 ,一共7个 */
char key[4][6]={"else", "if", "int","while"};
char fuhao[6]={'(',')','{','}','=',';'};
char str[10000];/*存放待查着的字符串 */
FILE *in, *out;/*输入输出文件指针 */
char inToken[1000][10];
int tokennumber=0;
char tack[1000][10];/*LL(1)文法中用到的栈结构*/
//int top=0;/*栈的顶端指针*/
struct Link
{
char data[50];
char type[50];
int Isfirst;
};/*data用于存放字符,num用于指定源程序中的行数,type用于说明类型 分别为id,num,addop,mulop,relop*/
struct Link link[100];
int number=0;/*记录link数组中的当前位置*/
int line=0;/*用来记录当前所处理字符的行数*/
/*分析树的结点*/
struct tree
{
struct tree *father;
struct tree *son;
struct tree *brother;
char name[10];
char type[10];
char value[10];
int address;
};
struct tree *root;
struct code
{
char op1[10];
char op2[10];
char op3[10];
};
struct code c[100];
struct link/*该链表在建立树的时候用*/
{
struct tree * node;
struct link *next;
struct link *forword;
}
struct link *head,*last;
void move(struct tree *t);
void add(struct tree *t);
struct tree * get(char s[]);
void maketree(int i);
/*
判断str不是不全部由数字字符组成
*/
int IsNumber()
{
int i;
for ( i = 0; i<strlen(str) ;i++)
{
if (str[i]<'0' || str[i]>'9')/*只要字符串里有一个不是数字字符,就不是数字了*/
{
return 0;
}
}
return 1;
}
int IsFuhao(char s)
{
if(s==';'||s=='('||s==')'||s=='{'||s=='}'||s==',') return 1;
else return 0;
}
/*
判断字符串s是否在以识别的符号串中
*/
int IsInLink1(char s[])
{
int i;
for(i=0;i<number;i++)
{
if(strcmp(link[i].data, s)==0) return i;
}
return 0;
}
/*
判断字符s是否在以识别的符号中
*/
int IsInLink2(char s)
{
int i;
for(i=0;i<number;i++)
{
if(link[i].data[0]==s) return i;
}
return 0;
}
int IsKey(char str[])
{
int i;
for(i=0;i<4;i++)
{
if(strcmp(key[i], str)==0) return i;
}
return 0;
}
/*一旦分析出了一个标识,就应该清空str串,为下一次做准备 */
void FindKey()
{
int i,num;
if (strlen(str)==0)/*没有待分析的内容*/
{
return;/*直接返回 */
}
/*先在关键字表里找,如果找到关键字则直接输出并加入到符号表中*/
for (i = 0; i<4 ;i++)
{
if(strcmp(key[i], str)==0)/*找到了 */
{
if(IsInLink1(str))
{
printf("%s ",str);
fprintf(out,"%s ",str);
strcpy(link[number].data,str);
strcpy(link[number].type,str);
link[number].Isfirst=0;
number++;
}
else
{
printf("%s ",str);
fprintf(out,"%s ",str);
strcpy(link[number].data,str);
strcpy(link[number].type,str);
link[number].Isfirst=1;
number++;
}
strcpy(inToken[tokennumber],str);
tokennumber++;
strset(str, '\0');/*清空待处理字符串*/
return;
}
}
/*看看是不是自定义标识符 */
if (str[0]>'A' && str[0]<'z')/*只要开头一个是字符,就是一个合法的自定义标识符 */
{
num=IsInLink1(str);
if(num)
{
printf("id%d ",num);
fprintf(out,"id%d ",num);
strcpy(link[number].data,str);
strcpy(link[number].type,"id");
link[number].Isfirst=0;
number++;
}
else
{
printf("id%d ",number);
fprintf(out,"id%d ",number);
strcpy(link[number].data,str);
strcpy(link[number].type,"id");
link[number].Isfirst=1;
number++;
}
strcpy(inToken[tokennumber],"id");
tokennumber++;
/*fprintf(out, "(%d,\"%s\")", 8, str);自定义标识号的种码为8*/
strset(str, '\0');/*清空待处理字符串*/
return;
}
/*看看是不是数字,条件是必须全部为数字 */
if (IsNumber())
{
num=IsInLink1(str);
printf("num%d ",number);
fprintf(out,"num%d ",number);
strcpy(link[number].data,str);
strcpy(link[number].type,"num");
if(num)
{
link[number].Isfirst=0;
}
else
{
link[number].Isfirst=1;
}
number++;
strcpy(inToken[tokennumber],"num");
tokennumber++;
strset(str, '\0');/*清空待处理字符串*/
}
else/*无法识别了*/
{
num=IsInLink1(str);
if(num)
{
printf("unknown%d ",number);
fprintf(out,"unknown%d ",number);
strcpy(link[number].data,str);
strcpy(link[number].type,"unknown");
link[number].Isfirst=0;
number++;
}
else
{
printf("unknown%d ",number);
fprintf(out,"unknown%d ",number);
strcpy(link[number].data,str);
strcpy(link[number].type,"unknown");
link[number].Isfirst=1;
number++;
}
strcpy(inToken[tokennumber],"unknown");
tokennumber++;
/*fprintf(out, "(%d,\"%s\")", 29, str);*//*无法识别的标识的种码为29 */
strset(str, '\0');/*清空待处理字符串*/
}
}
/*
默认从source.c中读取源文件,并把分词结果存入out.txt中
*/
void hand_addop(char s)/*用于处理addop的函数*/
{
int num;
num=IsInLink2(s);
if(num)
{
printf("addop%d ",number);
fprintf(out,"addop%d ",number);
link[number].data[0]=s;
strcpy(link[number].type,"addop");
link[number].Isfirst=0;
number++;
}
else
{
printf("addop%d ",number);
fprintf(out,"addop%d ",number);
link[number].data[0]=s;
strcpy(link[number].type,"addop");
link[number].Isfirst=1;
number++;
}
strcpy(inToken[tokennumber],"addop");
tokennumber++;
}
void hand_mulop(char s)/*处理mulop的函数*/
{
int num;
num=IsInLink2(s);
if(num)
{
printf("mulop%d ",number);
fprintf(out,"mulop%d ",number);
link[number].data[0]=s;
strcpy(link[number].type,"mulop");
link[number].Isfirst=0;
number++;
}
else
{
printf("mulop%d ",number);
fprintf(out,"mulop%d ",number);
link[number].data[0]=s;
strcpy(link[number].type,"mulop");
link[number].Isfirst=1;
number++;
}
strcpy(inToken[tokennumber],"mulop");
tokennumber++;
}
void hand_relop(char s)/*处理relop的函数*/
{
int num;
num=IsInLink2(s);
if(num)
{
printf("relop%d ",number);
fprintf(out,"relop%d ",number);
link[number].data[0]=s;
strcpy(link[number].type,"relop");
link[number].Isfirst=0;
number++;
}
else
{
printf("relop%d ",number);
fprintf(out,"relop%d ",number);
link[number].data[0]=s;
strcpy(link[number].type,"relop");
link[number].Isfirst=1;
number++;
}
strcpy(inToken[tokennumber],"relop");
tokennumber++;
}
void hand_fuhao(char s)/*处理fuhao的函数*/
{
int num;
num=IsInLink2(s);
if(num)
{
printf("%c ",s);
fprintf(out,"%c ",s);
link[number].data[0]=s;
//strcpy(link[number].type,"fuhao");
link[number].type[0]=s;
link[number].Isfirst=0;
number++;
}
else
{
printf("%c ",s);
fprintf(out,"%c ",s);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -