实验三 语法分析c语言实验报告

上传人:第*** 文档编号:32759195 上传时间:2018-02-12 格式:DOC 页数:10 大小:85.50KB
返回 下载 相关 举报
实验三 语法分析c语言实验报告_第1页
第1页 / 共10页
实验三 语法分析c语言实验报告_第2页
第2页 / 共10页
实验三 语法分析c语言实验报告_第3页
第3页 / 共10页
实验三 语法分析c语言实验报告_第4页
第4页 / 共10页
实验三 语法分析c语言实验报告_第5页
第5页 / 共10页
点击查看更多>>
资源描述

《实验三 语法分析c语言实验报告》由会员分享,可在线阅读,更多相关《实验三 语法分析c语言实验报告(10页珍藏版)》请在金锄头文库上搜索。

1、实验三语法分析实验报告题目 语法分析的 C 语言实现姓名及分工康黎明 SWE10029陈俊杰 SWE10031许冬青 SWE10033王吉 SWE10028日期 2012-12-20一、实验目的:加深对语法分析器工作过程的理解;能够采用一种编程语言实现简单的语法分析程序;能够使用自己编写的分析程序对简单的程序段进行语法分析。二、实验分工:小组成员共同分析实验过程,在老师的指导分析下,完成了完整的程序编码。三、程序说明:1程序输入示例:输入由一个 input.c 输入,直接从 input.c 读取一个 token,将用到的文法规则输出。上图对应的 C 语言程序为main()ID=NUM*(ID+

2、ID)2程序输出示例运行语法分析器程序,有输出窗口直接显示运行结果:4、说明:编译环境说明:Windows 下的 Visual C+文法说明:0. program main() if_stmt 1. if_stmt if ( expression ) statement | if ( expression ) statement else statement条件语句有通常的语义:对表达式进行计算,非0值表示条件为真,引起第一条语句的执行;0值表示条件为假,引起第二条语句的执行,如果它存在的话。这条规则存在典型的“dangling else ”二义性,可以用一种“最近嵌套”原则解决二义性。建议:

3、可实现 if_stmt if ( expression ) statement else statement;根据自身情况如果要实现不带 else 的语句。2. statement expression ; | ;3. expression var = expression | simple-expression4. var ID | ID expression 表达式是一个变量引用,后面跟着赋值符号(等号)和一个表达式,或者就是一个简单的表达式。赋值的语义为:首先找到由变量var的地址,然后对赋值符右边的子表达式进行求值,再将子表达式的值存储到给定的地址。这个值也作为整个表达式的值返回。va

4、r是简单的整型变量或下标数组变量。需要检查下标值为非负,但不进行下标越界检查。建议:可实现var ID;根据实际情况实现var ID expression 数组变量的识别。5. simple-expression additive-expression relop additive-expression | additive-expression6. relop | = | = |!=7. additive-expression additive-expression addop term | term8. addop + | - 9. term term mulop factor | fac

5、tor10. mulop * | / 加法表达式和项表示了算术操作符的结合性和优先级。11. factor ( expression ) | var | NUM因子是围在括号内的表达式;或一个变量,求出其变量的值;或者一个函数调用,求出函数的返回值;或者一个NUM,其值由词法分析器确定。其他说明:递归下降要求消除左递归和回溯。五、源程序#include#includeFILE *fp; /文件指针char token100; /定义 token 长度int i;char *current=NULL; /当前值为 nullchar character;void match(char *t);vo

6、id getString();void error();void programe();void expression();void expression_stmt();void simple_expression();void relop();void additive_expression();void T();void term();void factor();void E();void G();int main(void)fp=fopen(input.c,r);getString();programe();return 0;void match(char *t)if(strcmp(t,

7、current)=0)getString(); /如果匹配获取该 characterelse error(); /如果匹配失败打印出出错信息 exit();void getString()token0=0;i=0;character = fgetc(fp); /从 input 文件读取 characterif(!feof(fp)while(1)tokeni=character;i+;tokeni=0;character = fgetc(fp);if(character = )break;elsefclose(fp); /读取失败,关闭文件current = token;/ printf(当前取

8、到 current+%sn,current);void error(int i)printf(errorn); /打印出出错信息void programe()if(strcmp(main,current)=0)match(main);match();match();match();expression_stmt(); /开始识别赋值语句if(strcmp(,current)=0) /结束语义分析printf(program-main() expression_stmt n); /打印出结束语句void expression_stmt()/printf(转到 expression_stmt()n

9、);if(strcmp(;,current)=0)match(;);printf(expression_stmt-;n);elseexpression(); match(;);printf(expression_stmt-expression;n);void expression()/printf(转到 expression()n);if(strcmp(ID,current)=0)match(current);/6 +NUM.expression();printf(expression-IDn);/ printf(factor-( expression ) | IDn);else if(str

10、cmp(=,current)=0)match(=);simple_expression();/NUM*(ID+NUM+NUM);printf(expression-=n);elsesimple_expression();/7printf(expression-simple-expressionn);void simple_expression()/printf(转到 simple_expression()n);additive_expression();/NUM*(ID/+NUM+NUM);G();void G()/printf(转到 G()n);if(strcmp(,current)=0)m

11、atch();additive_expression();printf(simple-expression additive-expression relop n);else if(strcmp(=,current)=0)match(=);additive_expression();printf(simple-expression additive-expression relop n);else if(strcmp(!=,current)=0)match(!=);additive_expression();printf(simple-expression additive-expressio

12、n relop n);else if(strcmp(=,current)=0)match(=);additive_expression();printf(simple-expression additive-expression relop n);void additive_expression()/printf(转到 additive_expression()n);term();T();/+NUM+NUM);void T()/printf(转到 T()n);if(strcmp(+,current)=0)match(+);term();printf(addop-+ |- | +n);T();e

13、lse if(strcmp(-,current)=0)match(-);term();printf(addop-+ |- | -n);T();void term()/printf(转到 term()n);factor();/1E();/2void E()/printf(转到 E()n);if(strcmp(*,current)=0)match(*);factor();/3printf(mulop-* |/ | *n);E();else if(strcmp(/,current)=0)match(/);factor();printf(mulop-* |/ | /n);E();void factor

14、()/printf(转到 factor()n);if(strcmp(,current)=0)match();/4(ID.)expression();/5match();printf(factor-( expression )n);else if(strcmp(ID,current)=0)match(ID);printf(factor-( expression ) | IDn);else if(strcmp(NUM,current)=0)match(NUM);printf(factor-( expression ) | NUMn);六、实验总结:通过本次实验,让我们对 YACC 有了初步的认识和运用,同时理解到很多语法分析的知识。了解原来 YACC 原来比 C 语言方便很多,同时也要感谢在实验过程中老师的帮忙和指导。

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 建筑/环境 > 工程造价

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号