📄 exp_2.cpp
字号:
#include<stdio.h>
#include<string.h>
#include<ctype.h>
#define NULL 0
FILE *fp;
char TOKEN; //存放二元式的单词
int a; //指示二元式的类别编码
int id_eof=0; //指示是否读到结束符的标志
int id_error=0; //指示输入串有错误的标志
void advance(void);
int match(char);
void T_state(void);
void F_state(void);
void E_state(void);
void E_state1(void);
void T_state1(void);
int match(char d)
{
if (TOKEN==d)
return 1;
else return 0;
}
void advance ()
{
//int i=0,j;
if(!match('j')) //读到的下一个字符不是结束符,则继续读字符串
{
/*TOKEN=fgetc(fp);
TOKEN=fgetc(fp);TOKEN=fgetc(fp);TOKEN=fgetc(fp);TOKEN=fgetc(fp);*/
//i=i^1;
//j=i+1;
//TOKEN=fseek(fp,3*sizeof(char),1);
fscanf(fp,")(%d,",&a);
TOKEN=fgetc(fp);
if((a==0 && match('i')) ||((a==1)&&(match('*')||match('-')||match('+')||match('/')||match('(')||match(')'))))
{}
else if (match('j'))
TOKEN=EOF;
else {
printf("error\n"); id_error=1;}
}
else
TOKEN=EOF;
}
void T_state()
//T产生式判断程序
{
//printf("F→ (E)|i\n");
F_state();
//printf("T'→MFT'|ε\n");
T_state1();
/* if(TOKEN[0]=='(') //判断例如:a+b(c+d)*a的情况
{
printf("'*' or '/' or '+' or '-' lost!\n");
id_error=1;
}*/
}
void T_state1()
{
if(match('*')||match('/'))
{
printf("T'->MFT'\n");
advance();
//printf("F→ (E)|i\n");
F_state();
//printf("T'→MFT'\n");
T_state1();
}
else printf("T'->ε\n");
}
void F_state()
//F产生式判断程序
{
// if (isalpha(TOKEN)||isalnum(TOKEN))
if (match('i'))
{
printf("F→ i\n");
advance();
}
else if(match('('))
{
printf("F→(E)\n");
advance();
printf("E→TE'\n");
E_state();
if(match(')'))
{
printf("F→(E)\n");
advance();
}
else //输出判断到的错误,使错误表示符置1
{
printf("Mismatched parentheses ')'!\n");
id_error=1;
}
}
else //输出判断到的错误,使错误表示符置1
{
printf("Num or Id excepted!\n");
id_error=1;
}
}
void E_state()
//E产生式判断程序
{
printf("T→FT'\n");
T_state();
//printf("E'→ATE'\n");
E_state1();
}
void E_state1()
{
if (match('+') || match('-'))
{
printf("E'->ATE'\n");
advance();
printf("T→FT'\n");
T_state();
//printf("E'→ATE'\n");
E_state1();
}
}
void main()
{
if((fp=fopen("in.txt","r"))==NULL) //读取文件失败
printf("读取文件失败!\n");
else
{
advance();
printf("E→TE'\n");
E_state();
}
if(id_error)
printf("不是该文法产生式!\n\n\n");
else
printf("是该文法的产生式!\n\n\n");
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -