语法分析器

  • 格式: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 char inputstream[50]; //存储输入句子

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++语言知识的深化和用途的理解。