语法分析器
- 格式:doc
- 大小:91.50 KB
- 文档页数:9
编译原理实验报告
——表达式语法分析
表达式语法分析实验报告
一、实验题目
设计一个简单的表达式语法分析器
(采用递归下降方法设计实现)
二、实验目的
1、 了解形式语言基础及其文法运算;
2、 熟悉语法分析原理及4种常用的语法分析方法;
其中: 四种算法为
(1)设计算术表达式的递归下降子程序分析算法
(2)设计算术表达式的LL(1) 分析算法
(3)设计算术表达式的简单优先分析算法
(4)设计算术表达式的SLR(1) 分析算法
3、选择上述一种方法并设计一个表达式的语法分析器。
(本实验设计的是递归下降的表达式语法分析器)
三、实验内容
1.设计递归下降语法分析器算法;
2.编写代码并上机调试运行通过;
3、写出试验体会及心得。
四、实验要求
1、 给出算术表达式文法
2、 进行适当的文法变换
3、 选择一种语法分析的方法,并说明其原理
4、 根据原理给出相应的算法设计,说明主要的数据结构并画出算法流程图
5、 编写代码并上机调试运行通过
6、 写出程序运行结果
7、 写出相应的文档以及代码注释
8、输入——表达式;
输出——表达式语法是否正确。
五、递归下降的表达式语法分析器设计概要
1.算术表达式文法
G(E): E E +T | T
T T* F | F
F i | (E)
2.文法变换:
G’(E): E->TE'
E'->+TE'|ε
T->FT'
T'->*FT'|ε
F->(E)|I
3. 递归下降子程序框图:
六、实验设计源程序
#include
int temp=0; //数组下标
int right; //判断输出信息
void e();
void e1();
void t();
void t1();
void f();
void main()
{
right=1;
cout<<"请输入您要分析的字符串以#结束(^为空字符):"< cin>>inputstream; e(); if((inputstream[temp]=='#')&&right) cout<<"分析成功"< else cout<<"分析失败"< } void e() { cout<<"E->TE'"< t(); e1(); } void e1() { if(inputstream[temp]=='+') { cout<<"E'->+TE'"< temp++; t(); e1(); } else if (inputstream[temp]!='#'||inputstream[temp]!=')') { cout<<"T'->^"< return ; } else right=0; } void t() { cout<<"T->FT'"< f(); t1(); } void t1() { if(inputstream[temp]=='*') { cout<<"T'->*FT'"< temp++; f(); t1(); } else if (inputstream[temp]!='#'&&inputstream[temp]!=')'&&inputstream[temp]!='+') { cout<<"T'->^"< right=0; } } void f() { if(inputstream[temp]=='i') { cout<<"F->i"< temp++; } else if(inputstream[temp]=='(') { cout<<"F->(E)"< temp++; e(); if(inputstream[temp]==')') { cout<<"F->(E)"< temp++; } else right=0; } else right =0; } 七、运行结果 八、实验思考题 语法分析的任务是什么? 答:语法分析器的任务是识别和处理比单词更大的语法单位,如:程序设计语言中的表达式、各种说明和语句乃至全部源程序,指出其中的语法错误;必要时,可生成内部形式,便于下一阶段处理。 九、实验体会 通过此次实验,让我了解到如何设计、编写并调试语法分析部分的相关程序,并加深对语法分析原理的理解;熟悉了构造语法分析程序的手工方式的相关原理,使用某种高级语言(例如C++语言)直接编写此法分析程序。 另外,通过本次实验,也让我重新熟悉了C++语言的相关内容,加深了对C++语言知识的深化和用途的理解。