递归下降语法分析实验报告

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

编译原理实验报告

一、实验目的:

(1)掌握自上而下语法分析的要求与特点。

(2)掌握递归下降语法分析的基本原理和方法。

(3)掌握相应数据结构的设计方法。

二、实验内容:

编程实现给定算术表达式的递归下降分析器。

算术表达式文法如下:

S→a|∧|(T)

T→T,S|S

三、设计说明:

首先改写文法为LL(1)文法;然后为每一个非终结符,构造相应的递归过程,过程的名字表示规则左部的非终结符;过程体按规则右部符号串的顺序编写。

四、设计分析

这个题目属于比较典型的递归下降语法分析。需要先将原算术表达式方法改写为LL(1)文法为:

S→a|∧|(T)

T→ST’

T’→,ST’|ε

然后再为每个非终结符设计一个对应的函数,通过各函数之间的递归调用从而实现递归下降语法分析的功能。

具体方法为:

(1)当遇到终结符a时,则编写语句

If(当前读到的输入符号==a)读入下一个输入符号

(2)当遇到终结符∧时,则编写语句

If(当前读到的输入符号==∧)读入下一个输入符号

(3)当遇到终结符﹙时,则编写语句

If(当前读到的输入符号==﹙)读入下一个输入符号

(4)当遇到非终结符T时,则编写scaner()函数读取下一个单词符号并将它放在全程变量sym中

(5)当遇到非终结符S时,则编写S()函数

(6)当遇到非终结符T’时,则编写T’()

(7)当遇到终结符,时,则编写语句

If(当前读到的输入符号==,)读入下一个输入符号

(8)当遇到非终结符T时,则编写T()

五、实验代码

#include"stdio.h"

void S();

void T();

void scaner();

void error();

char sym;

char s[100];

int i=0;

int main()

{

printf("请输入一个语句,以#号结束语句(直接输入#号推出)\n");

scanf("%s",&s);

scaner();

S();

if (sym=='#')

{

printf("success");

return 1;

}

else

{

printf("fail");

return 0;

}

}

void scaner(){

sym=s[i];

i++;

}

void T'(){

if(sym==',')

{

scaner();

S();

T'();

}

else if(sym!=')')

error();

}

void error(){

printf("语句有误!\n");

}

void T()

{

S();

T'();

}

void S()

{

if (sym=='a'||sym=='^')

scaner();

else if(sym=='(')

{

scaner();

T();

if(sym==')')

scaner();

else

error();

}

else

error();

}

六、测试用例和实验结果

(1)输入a,预期显示语句正确!

(2)输入∧,预期显示语句正确!

(3)输入(a,b),预期显示语句有误!

(4)输入(a ,a),预期显示语句正确!

(5)输入(a,(a,a)),预期显示语句正确!

七、测试结果截图

(1)输入a的测试结果

(2)输入^的测试结果

(3)输入(a,b)的测试结果

(4)输入(a ,a)的测试结果

(5)输入(a,(a,a))测试结果

相关文档
最新文档