实验三-递归下降法的语法分析器

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

魏陈强 204168

实验3 递归下降法的语法分析器

一、实验目的

学习用递归下降法构造语法分析器的原理,掌握递归下降法的编程方法。

二、实验内容

用递归下降法编写一个语法分析程序,使之与词法分析器结合,能够根据语言的上下文无关文法,识别输入的单词序列是否文法的句子。

这里只要求实现部分产生式,文法的开始符号为program。(完整的源语言的文法定义见教材附录,p394)

program→ block

block→{stmts }

stmts→stmt stmts |

stmt→id=expr;

| if(bool)stmt

| if( bool)stmt else stmt

| while(bool)stmt

| do stmt while(bool ) ;

| break ;

| block

bool →expr < expr

| expr <= expr

| expr > expr

| expr >= expr

&

| expr

expr→ expr + term

| expr - term

| term

term→ term * factor

| term / factor

| factor

factor→ ( e xpr ) | id| num

三、实验要求

1.个人完成,提交实验报告。

(

2.实验报告中给出采用测试源代码片断,及其对应的最左推导过程(形式可以自行考虑)。

测试程序片断:

{

i = 2;

while (i <=100)

{

sum = sum + i;

i = i + 2;

}

}

对应的推导过程为:

#

program block

{stmts }

{stmt stmts}

{id=expr;stmts }

{id=num;stmts }

{id=num;stmt stmts }

{id=num;while(bool)stmt stmts }

{id=num;while(e xpr<= expr)stmt stmts }

{id=num;while(id<= expr)stmt stmts }

{id=num;while(id<= num)stmt stmts }

{id=num;while(id<= num)block stmts }

{id=num;while(id<= num){stmts }stmts }

.......

四、实验思路

之前编写的词法分析器,能够将语句中的每一个词素都识别出来,因此,在此基础上,定义一个二维字符串数组finaltable[100][20],用于存放由词法分析器提取出来的每个词素,比如,i=2,则finaltable[0]=”id”,finaltable[1]=”=”,finaltable[2]=”num”。并且,为了以后能够方便使用switch() case 语句,另外再定义一个一维整型数组finaltableint[100],用于存放一个数字和finaltable[100][20]中的字符串对应。这里,我们定义if=100,for=200,else=300,while=400,do=500,float=600,int=700,break=800,< = 17,<= = 16,> = 15,>= = 14,+ = 13,&&=12,||=11,}=10,{=9,;=8;)=7,(=6,= = 5,== = 4,!= =3,/=2,id =1,keyword=0,num=99,*=18,- = 19。然后依据语法分析的正则表达式,参照实验一类似中缀改后缀的写法以及课本40页的伪代码编写。相比词法分析器,词法分析的时候,是以单个字符为一个单位,而语法分析,我们以字符串为单位,这些字符串即finaltable[100][20]中的字符串。编写的过程中涉及几个问题,1、如何把每一步的迭代都显示出来对于这个问题,可以在每个非终结符函数的开头输出对应的迭代即可。2、在应用文法的时候,应该首先消除左递归,这是至关重要的,该实验我们只要消除expr()和term()的左递归即可。3、if语句二义性处理。对于这个问题,我们只要再往后看一个字符串,看其是否是else,如果是,则匹配if( bool)stmt else stmt,否则匹配if( bool ) stmt。4、对于空选择,如何处理一开始的时候,我选择暂时忽略。

五、实验代码

#include<>

#include<>

#include <>

/*

if=100,for=200,else=300,while=400,do=500,float=600,int=700,break=800,< = 17,<= = 16,> = 15,>= = 14,+ = 13,&&=12,||=11,}=10,{=9,;=8;)=7,(=6,= = 5,== = 4,!= =3,/=2,id =1,keyword=0,num=99,*=18,- = 19 */

char

*keyword[8]={"if","for","else","while","do","float","int","break"}; char keywordtable[20][20],re_keywordtable[20][20];

char digittable[20][20],re_digittable[20][20];

char otherchartable[20][20],re_otherchartable[20][20];

char idtable[20][20],re_idtable[20][20];

char notetable[20][20];

char finaltable[100][20];

int finaltableint[100];

char word[20];

~

相关文档
最新文档