资源简介
完成以下描述算术表达式的LL(1)文法的递归下降分析程序
G[E]: E→TE′
E′→ATE′|ε
T→FT′
T′→MFT′|ε
F→ (E)|i
A→+|-
M→*|/
代码片段和文件信息
/* 实验题目: 识别下列表达式 */
/*G[E]: E→TE‘
E‘→ATE‘|ε
T→FT‘
T‘→MFT‘|ε
F→ (E)|i
A→+|-
M→*|/
*/
#include“stdio.h“
#include“malloc.h“
#include“string.h“
#include
void e();
void t();
void e_prime();
void t_prime();
void f();
bool match(char);
void advance();
char ch;
int right;
char juzi[10];
int stri=0;
int line=0;
void main(void)
{
right=1;
char TOKENCL[2]string[10]cht;
FILE *fp;
int i=0flagflagover=0;
while((fp=fopen(“test1.txt““r“))==NULL)
{
printf(“cannot open file!(Ctrl+C exit)\n“);
//scanf(“\n%s“filename);
}
cht=fgetc(fp);
while(cht!=‘\n‘){
//while(cht!=‘\n‘) //字符是回车时,开始新的一行检索
do{
cht=fgetc(fp);
if(isdigit(cht))
{
TOKENCL[0]=cht;
cht=fgetc(fp);
i=1;
if(isdigit(cht))
{
TOKENCL[i]=cht;
i++;
cht=fgetc(fp);
} //取完二元式类型
TOKENCL[i]=‘\0‘;
if((cht==‘‘)&&(strcmp(TOKENCL“10“)==0))
{
flag=1;
//flagf=1;
cht=fgetc(fp);
}
if((strcmp(TOKENCL“7“)==0||strcmp(TOKENCL“6“)==0)&&cht==‘‘&&flag==1)
{
string[stri]=‘i‘;
stri++;
}
else if(strcmp(TOKENCL“18“)==0&&cht==‘‘)
{
for(int j=0;j<2;j++)
{
cht=fgetc(fp);
} //跳出cht指向‘
string[stri]=cht;
stri++;
cht=fgetc(fp);
}
if(strcmp(TOKENCL“2“)==0&&cht==‘‘)
{
flagover=1;
break;
}
if(strcmp(TOKENCL“1“)==0&&cht==‘‘)
{
line++;
}
}
}while(cht!=‘;‘);
line++;
if(flagover==0){
string[stri]=‘#‘;
stri++;
string[stri]=‘\0‘;
flag=0;
strcpy(juzistring);
stri=0;
printf(“\n%s\n“juzi);
e();
if(right==1&&ch==‘#‘)
printf(“ok\n“);
else
printf(“no\n“);
stri=0;
string[0]=‘\0‘;
}
else
break;
}
}
void e()
{
t();
e_prime();
}
void e_prime()
{
if(match(‘+‘)||match(‘-‘))
{
advance();
t();
e_prime();
}
if(!match(‘#‘)||!match(‘)‘))
return;
else
{
right=0;
printf(“第%d行有多余字符\n“line);
}
}
void t()
{
f();
t_prime();
}
void t_prime()
{
if(match(‘*‘)||match(‘/‘))
{
advance();
f();
t_prime();
}
else
if( !match(‘#‘)&&!match(‘)‘)&&!match(‘+‘)&&!match(‘-‘))
{
right=0;
printf(“第%d行出错\n“line);
}
}
void f()
{
if(match(‘i‘))
advance();
else if(match(‘(‘))
{
advance();
e();
if(match(‘)‘))
advance();
else
{ right=0;
printf(“第%d行出错\n“line);
}
}
else
{
right=0;
printf(“第%d行出错\n“line);
}
}
void advance()
{
stri++;
ch=juzi[stri];
}
bool match(char comp)
{
if(comp==juzi[stri])
{
return true;
}
else
{
return false;
}
}
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 11232 2011-05-06 16:20 实验二\1.jpg
文件 12633 2011-05-06 16:25 实验二\2.jpg
文件 50176 2011-04-21 17:51 实验二\编译实验二\Debug\exp2_revise parser.bsc
文件 180320 2011-05-26 09:27 实验二\编译实验二\Debug\exp2_revise parser.exe
文件 198444 2011-05-26 09:27 实验二\编译实验二\Debug\exp2_revise parser.ilk
文件 11197 2011-05-26 09:27 实验二\编译实验二\Debug\exp2_revise parser.obj
文件 223664 2011-05-06 16:19 实验二\编译实验二\Debug\exp2_revise parser.pch
文件 467968 2011-05-26 09:27 实验二\编译实验二\Debug\exp2_revise parser.pdb
文件 0 2011-04-21 17:51 实验二\编译实验二\Debug\exp2_revise parser.sbr
文件 50176 2011-05-29 20:02 实验二\编译实验二\Debug\vc60.idb
文件 53248 2011-05-26 09:27 实验二\编译实验二\Debug\vc60.pdb
文件 2985 2011-05-26 09:27 实验二\编译实验二\exp2_revise parser.cpp
文件 3547 2011-05-29 20:02 实验二\编译实验二\exp2_revise parser.dsp
文件 561 2011-05-29 20:02 实验二\编译实验二\exp2_revise parser.dsw
文件 58368 2011-05-29 20:02 实验二\编译实验二\exp2_revise parser.ncb
文件 48640 2011-05-29 20:02 实验二\编译实验二\exp2_revise parser.opt
文件 270 2011-05-29 20:02 实验二\编译实验二\exp2_revise parser.plg
文件 164 2011-05-26 09:28 实验二\编译实验二\test1.txt
文件 564736 2011-05-28 17:21 实验二\编译实验二报告.doc
目录 0 2011-07-08 21:59 实验二\编译实验二\Debug
目录 0 2011-07-08 21:59 实验二\编译实验二
目录 0 2011-07-08 21:59 实验二
----------- --------- ---------- ----- ----
1938329 22
- 上一篇:校务通管理系统项目管理案例分析
- 下一篇:Snort 2.9.8.2预处理器开发文档
评论
共有 条评论