实验三 语法分析C语言实验报告_第1页
实验三 语法分析C语言实验报告_第2页
实验三 语法分析C语言实验报告_第3页
实验三 语法分析C语言实验报告_第4页
实验三 语法分析C语言实验报告_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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

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”二义性,可以用一种“最近嵌套”原则解决二义性。建议:可实现if_stmt

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

4、组变量。需要检查下标值为非负,但不进行下标越界检查。建议:可实现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 | factor10. mu

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

6、();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,current)=0)g

7、etString(); /如果匹配获取该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(当前取到current+%sn,curre

8、nt);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);if(strcmp(;,current)=

9、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(strcmp(=,current)=0)match(=)

10、;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)match(=); additive_expressi

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

12、;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-expression relop n);void additive_expression()/printf(转到additive_expression()n);term();T();

13、/+NUM+NUM);void T()/printf(转到T()n);if(strcmp(+,current)=0)match(+);term();printf(addop-+ |- | +n);T();else 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()/printf(转到factor()n);if(strcmp(,current)=0)match();/4(ID.)expression();/5match();printf(factor-( expression )n);else if(strcmp(ID,curren

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论