实验三 语法分析C语言实验报告.docx
- 文档编号:12210550
- 上传时间:2023-04-17
- 格式:DOCX
- 页数:12
- 大小:41.20KB
实验三 语法分析C语言实验报告.docx
《实验三 语法分析C语言实验报告.docx》由会员分享,可在线阅读,更多相关《实验三 语法分析C语言实验报告.docx(12页珍藏版)》请在冰豆网上搜索。
实验三语法分析C语言实验报告
《实验三 语法分析》实验报告
题目
语法分析的C语言实现
姓名及分工
康黎明SWE10029
陈俊杰SWE10031
许冬青SWE10033
王吉SWE10028
日期
2012-12-20
一、实验目的:
加深对语法分析器工作过程的理解;能够采用一种编程语言实现简单的语法分析程序;能够使用自己编写的分析程序对简单的程序段进行语法分析。
二、实验分工:
小组成员共同分析实验过程,在老师的指导分析下,完成了完整的程序编码。
三、程序说明:
1.程序输入示例:
输入由一个input.c输入,直接从input.c读取一个token,将用到的文法规则输出。
上图对应的C语言程序为
main()
{
ID=NUM*(ID+ID)
}
2.程序输出示例
运行语法分析器程序,有输出窗口直接显示运行结果:
4、说明:
编译环境说明:
Windows下的VisualC++
文法说明:
0.programmain(){if_stmt}
1.if_stmtif(expression)statement|if(expression)statementelsestatement
条件语句有通常的语义:
对表达式进行计算,非0值表示条件为真,引起第一条语句的执行;0值表示条件为假,引起第二条语句的执行,如果它存在的话。
这条规则存在典型的“danglingelse”二义性,可以用一种“最近嵌套”原则解决二义性。
建议:
可实现if_stmtif(expression)statementelsestatement;根据自身情况如果要实现不带else的语句。
2.statementexpression;|;
3.expressionvar=expression|simple-expression
4.varID|ID[expression]
表达式是一个变量引用,后面跟着赋值符号(等号)和一个表达式,或者就是一个简单的表达式。
赋值的语义为:
首先找到由变量var的地址,然后对赋值符右边的子表达式进行求值,再将子表达式的值存储到给定的地址。
这个值也作为整个表达式的值返回。
var是简单的整型变量或下标数组变量。
需要检查下标值为非负,但不进行下标越界检查。
建议:
可实现varID;根据实际情况实现varID[expression]数组变量的识别。
5.simple-expressionadditive-expressionrelopadditive-expression|additive-expression
6.relop<=|<|>|>=|==|!
=
7.additive-expressionadditive-expressionaddopterm|term
8.addop+|-
9.termtermmulopfactor|factor
10.mulop*|/
加法表达式和项表示了算术操作符的结合性和优先级。
11.factor(expression)|var|NUM
因子是围在括号内的表达式;或一个变量,求出其变量的值;或者一个函数调用,求出函数的返回值;或者一个NUM,其值由词法分析器确定。
其他说明:
递归下降要求消除左递归和回溯。
五、源程序
#include
#include
FILE*fp;//文件指针
chartoken[100];//定义token长度
inti;
char*current=NULL;//当前值为null
charcharacter;
voidmatch(char*t);
voidgetString();
voiderror();
voidprograme();
voidexpression();
voidexpression_stmt();
voidsimple_expression();
voidrelop();
voidadditive_expression();
voidT();
voidterm();
voidfactor();
voidE();
voidG();
intmain(void)
{
fp=fopen("input.c","r");
getString();
programe();
return0;
}
voidmatch(char*t)
{
if(strcmp(t,current)==0)
{
getString();//如果匹配获取该character
}
else
{
error();//如果匹配失败打印出出错信息
exit();
}
}
voidgetString()
{
token[0]='\0';
i=0;
character=fgetc(fp);//从input文件读取character
if(!
feof(fp))
{
while
(1)
{
token[i]=character;
i++;
token[i]='\0';
character=fgetc(fp);
if(character=='')
break;
}
}
else
fclose(fp);//读取失败,关闭文件
current=token;
//printf("当前取到current+%s\n",current);
}
voiderror(inti)
{
printf("error\n");//打印出出错信息
}
voidprograme()
{
if(strcmp("main",current)==0)
{
match("main");
match("(");
match(")");
match("{");
expression_stmt();//开始识别赋值语句
if(strcmp("}",current)==0)//结束语义分析
printf("program->main(){expression_stmt}\n");//打印出结束语句
}
}
voidexpression_stmt()
{
//printf("转到expression_stmt()\n");
if(strcmp(";",current)==0)
{
match(";");
printf("expression_stmt->;\n");
}
else
{
expression();
match(";");
printf("expression_stmt->expression;\n");
}
}
voidexpression()
{
//printf("转到expression()\n");
if(strcmp("ID",current)==0)
{
match(current);//6+NUM...
expression();
printf("expression->ID\n");
//printf("factor->(expression)|ID\n");
}
elseif(strcmp("=",current)==0)
{
match("=");
simple_expression();//NUM*(ID+NUM+NUM);
printf("expression->=\n");
}
else
{
simple_expression();//7
printf("expression->simple-expression\n");
}
}
voidsimple_expression()
{
//printf("转到simple_expression()\n");
additive_expression();//NUM*(ID/+NUM+NUM);
G();
}
voidG()
{
//printf("转到G()\n");
if(strcmp("<=",current)==0)
{
match("<=");
additive_expression();
printf("simple-expressionadditive-expressionrelop\n");
}
elseif(strcmp("<",current)==0)
{
match("<");
additive_expression();
printf("simple-expressionadditive-expressionrelop\n");
}
elseif(strcmp(">",current)==0)
{
match(">");
additive_expression();
printf("simple-expressionadditive-expressionrelop\n");
}
elseif(strcmp(">=",current)==0)
{
match(">=");
additive_expression();
printf("simple-expressionadditive-expressionrelop\n");
}
elseif(strcmp("!
=",current)==0)
{
match("!
=");
additive_expression();
printf("simple-expressionadditive-expressionrelop\n");
}
elseif(strcmp("==",current)==0)
{
match("==");
additive_expression();
printf("simple-expressionadditive-expressionrelop\n");
}
}
voidadditive_expression()
{
//printf("转到additive_expression()\n");
term();
T();//+NUM+NUM);
}
voidT()
{
//printf("转到T()\n");
if(strcmp("+",current)==0)
{
match("+");
term();
printf("addop->+|-|+\n");
T();
}
elseif(strcmp("-",current)==0)
{
match("-");
term();
printf("addop->+|-|-\n");
T();
}
}
voidterm()
{
//printf("转到term()\n");
factor();//1
E();//2
}
voidE()
{
//printf("转到E()\n");
if(strcmp("*",current)==0)
{
match("*");
factor();//3
printf("mulop->*|/|*\n");
E();
}
elseif(strcmp("/",current)==0)
{
match("/");
factor();
printf("mulop->*|/|/\n");
E();
}
}
voidfactor()
{
//printf("转到factor()\n");
if(strcmp("(",current)==0)
{
match("(");//4(ID....)
expression();//5
match(")");
printf("factor->(expression)\n");
}
elseif(strcmp("ID",current)==0)
{
match("ID");
printf("factor->(expression)|ID\n");
}
elseif(strcmp("NUM",current)==0)
{
match("NUM");
printf("factor->(expression)|NUM\n");
}
}
六、实验总结:
通过本次实验,让我们对YACC有了初步的认识和运用,同时理解到很多语法分析的知识。
了解原来YACC原来比C语言方便很多,同时也要感谢在实验过程中老师的帮忙和指导。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验三 语法分析C语言实验报告 实验 语法分析 语言 报告