📄 syntaxaanalysis.cpp
字号:
#include<stdio.h>
#include<ctype.h>
#include<stdlib.h>
FILE *fout;
char sym;
//获取一个字符
void getSymbol()
{
sym=fgetc(fout);
if(sym==EOF)
exit(0);
}
void Error()
{
printf("Error!\n");
exit(0);
}
void E1();
void F();
void F1();
void T();
void T1();
void P();
void E()
{
printf("E->TE1\n");
T();
E1();
//printf("验证通过!\n");
}
void E1()
{
if(sym=='+')
{
printf("E1->+E\n");
getSymbol();
E();
}
else if(sym=='#'||sym==')')
{
printf("E1->ε\n");
//getSymbol();
}
else
Error();
}
void F()
{
printf("F->PF1\n");
P();
F1();
}
void F1()
{
if(sym=='*')
{
printf("F1->*F1\n");
getSymbol();
F1();
}
else if(sym=='#'||sym=='a'||sym=='b'||sym=='('||sym==')'||sym=='^'||sym=='+')
{
printf("F1->ε\n");
//getSymbol();
}
else
Error();
}
void P()
{
if(sym=='(')
{
printf("P->(E)\n");
getSymbol();
E();
if(sym!=')')
getSymbol();
}
else if(sym=='a')
{
printf("P->a\n");
getSymbol();
}
else if(sym=='b')
{
printf("P->b\n");
getSymbol();
}
else if(sym=='^')
{
printf("P->^\n");
getSymbol();
}
else
Error();
}
void T()
{
printf("T->FT1\n");
F();
T1();
}
/*void T1()
{
if(isspace(sym))
{
getSymbol();
}
else
T();
}*/
void T1()
{
if(sym=='('||sym=='a'||sym=='b'||sym=='^')
{
printf("T1->T\n");
getSymbol();
T();
}
else if(sym=='#'||sym=='+'||sym==')')
{
printf("T1->ε\n");
//getSymbol();
}
else
Error();
}
void main()
{
//若源文件末尾没有回车,给源文件末尾自动添加一个回车,否则根据以上去字符函数的定义,读不出文件最后一个符号
FILE *fp;
fp=fopen("test.txt","a+");
fseek(fp,-1,SEEK_END);
if(fgetc(fp)!='\n')
{
fseek(fp,0,SEEK_END);
fprintf(fp,"\n");
}
fclose(fp);
fout=fopen("test.txt","r");
getSymbol();
E();
fclose(fout);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -