递归下降子程序编写

合集下载

递归下降法

递归下降法

E → TE' E' → +TE' | ε
main( ) { GetSym ( );
T → FT' T' → *FT' | ε
F → (E) | id
E ( ); if (sym= =‘#’) printf (“success”); else printf (“fail”);
}
递归下降分析法
E() {
例 设有文法G[E]: E→ E + T | T T→ T * F | F F→ (E) | id
试构造一个识别该文法句子的递归下 降分析程序。
递归下降分析法
分析 首先消去文法左递归,得到文法 G'[E]
E→E + T |T T→T * F |F
F→(E) | id
E → TE' E'→ +TE' | ε T → FT' T'→ *FT' | ε F → (E) | id
递归下降分析法
构造递归下降分析程序的方法:
为每个非终结符编制一个递归下降
分析函数,每个函数名是相应的非终结
符,函数体则是根据规则右部符号串的
结构和顺序编写。
A→α1α2…αn αi∈VT αi∈VN α1α2…αn=ε
递归下降分析法
(1) 当遇到终结符a时,则编写语句 if (当前读来的输入符号==a) 读下一个输入符号;

递归下降语法分析程序设计

递归下降语法分析程序设计

编译方法实验报告实验名称:简单的语法分析程序设计

实验要求

1.功能:对简单的赋值语句进行语法分析

随机输入赋值语句,输出所输入的赋值语句与相应的四元式

2.采用递归下降分析程序完成(自上而下的分析)

3.确定各个子程序的功能并画出流程图

4.文法如下:

5.编码、调试通过

采用标准输入输出方式。输入输出的样例如下:

【样例输入】

x:=a+b*c/d-(e+f)

【样例输出】(说明,语句和四元式之间用5个空格隔开)

T1:=b*c (*,b,c,T1)

T2:=T1/d (/,T1,d,T2)

T3:=a+T2 (+,a,T2,T3)

T4:=e+f (+,e,f,T4)

T5:=T3-T4 (-,T3,T4,T5)

x:=T5 (:=,T5,-,x)

【样例说明】程序除能够正确输出四元式外,当输入的表达式错误时,还应能检测出语法错误,给出相应错误提示。

6.设计3-5个赋值语句测试实例,检验程序能否输出正确的四元式;当输入错误的句子时,

检验程序能够给出语法错误的相应提示信息。

7.报告容包括:

递归程序的调用过程,各子程序的流程图和总控流程图,详细设计,3-5个测试用例的程序运行截图及相关说明,有详细注释的程序代码清单等。

目录

1.语法分析递归下降分析算法4

1.1背景知识4

1.2消除左递归6

2.详细设计及流程图6

2.1 函数void V( ) // V -> a|b|c|d|e...|z6

2.2 函数void A( ) // A -> V:=E7

2.3 函数void E() //E -> TE'7

2.4函数void T( ) // T -> FT'8

递归下降语法分析

递归下降语法分析

实验项目名称:递归下降语法分析实验学时: 6 同组学生姓名:实验地点:

实验日期:实验成绩:

批改教师:批改时间:

一、实验目的和要求

通过本实验,了解递归下降预测分析的原理和过程以及可能存在的回溯问题,探讨解决方法,为预测分析表方法的学习奠定基础。分析递归下降子程序的优缺点。

二、实验仪器和设备

硬件系统:586以上计算机、服务器要求内存256以上、Cpu 2.0GHz以上、Clinet内存128以上、CPU奔腾III以上,硬盘,光驱等

软件系统:Visual Studio 2005中文版软件

三、实验过程

1、设计框架

图1-1 递归下降程序框架图

2、设计步骤

1)给定文法:

E→E+T|T

T→T*F|F

F→(E)|i

2)构造FIRST()集和FOLLOW()集

表2-1 FIRST()集和FOLLOW()集

3、程序源代码

using System;

using System.Collections.Generic;

using System.Text;

namespace递归下降语法分析

{

public class Program

{

public static char []a=new char[50];

public static char []b=new char[50];

public static char []d=new char[200];

public static char []e=new char[10];

public static char ch;

public static int n1,i1=0,flag=1,n=5;

递归下降子程序编写

递归下降子程序编写

实验5-6 递归下降子程序的编写

一、实验目的

通过本实验,了解递归下降预测分析的原理和过程以及可能存在的回溯问题,探讨解决方法,为预测分析表方法的学习奠定基础。分析递归下降子程序的优缺点。

二、实验准备

1.预习自上而下语法分析小节的内容;

2.学生自己考虑使用的开发环境,如VC++,熟悉开发环境。

三、实验内容

下列文法中选做一题:

1.针对算术表达式文法:E→TE’

E’→ +TE’|ε

T→FT’

T’→*FT’ |ε

F→(E) |i

为其编写递归下降子程序,判定某个算术表达式是否正确:如j+k*m,j*k+m

输入:其输入数据应该为词法分析器输出的记号形式:i+i*i,i*i+i

输出:分析结果:算术表达式结构正确或结构错误。

2.给定文法(PASCAL语言标识符定义文法)

type→simple|↑id|array[simple] of type

Simple→integer|char|num dotdot num

其中:dotdot表示..

编写递归下降子程序,判定一个句子结构是否正确:array [3..5]of integer 输入:其输入数据应该为词法分析器输出的单词序列:array[num dotdot num] of integer

输出:该句子结构是正确或错误

3.给定文法:

S→(T)|a+S|a

T→T,S|S

改写文法,使其可以使用递归下降子程序方法进行分析,编写递归下降子程序,判断句子:(((a+a+a),a+a),a)是否符合该文法。

S→(T)|aS’

S’→+S|ε

T→ST’

T’→,ST’|ε

编译原理实验语法器递归下降子程序实现解析

编译原理实验语法器递归下降子程序实现解析

编译原理程序设计实验报告

——表达式语法分析器的设计班级:计算机1306班姓名:张涛学号:20133967 实验目标:用递归下降子程序设计实现表达式语法分析器

实验内容:

⑴概要设计:通过对实验一的此法分析器的程序稍加改造,使其能够输出正确的表达式的token序列。然后利用LL(1)分析法实现语法分析。

⑵数据结构:

int op=0; //当前判断进度

char ch; //当前字符

char nowword[10]=""; //当前单词

char operate[4]={'+','-','*','/'}; //运算符

char bound[2]={'(',')'}; //界符

struct Token

{

int code;

char ch[10];

}; //Token定义

struct Token tokenlist[50]; //Token数组

struct Token tokentemp; //临时Token变量⑶流程图:

⑷关键函数:

int IsLetter(char ch) //判断ch是否为字母

int IsDigit(char ch) //判断ch是否为数字

int Iskey(char *string) //判断是否为关键字

int Isbound(char ch) //判断是否为界符

int Isboundnum(char ch) //给出界符所在token值void T(); //分析子程序

void F(); //分析子程序

void E1(); //分析子程序

void E(); //分析子程序

void T1(); //分析子程序

递归下降分析程序

递归下降分析程序

一、实验目的:

根据某一文法编制调试递归下降分析程序,以便对任意输入的符号串进行分

析。本次实验的目的主要是加深对递归下降分析法的理解。

二、程序算法描述

这次的实习主要是根据以下文法实现一个递归下降分析器,依据文法如下:

(1)E->TG

(2)G->+TG|— TG| &

(3)T->FS

(4)S->*FS|/FS|&

(5)F->(E)|i

在这个递归下降分析器程序中每一个非终结符E、G、T、S和F构造相应的递归函数,函数的名字表示文法左部的非终结符,函数中就是按文法中每个非终

结符右部的候选式依次进行匹配,根据对输入串的分析如果非终结符可以用其中的一个候选式替代就返回1,否则返回0。因为该文法中有五个非终结符,所以定义了五个函数,分别为E (),G (),T(),S(和F ()。当输入一串字符串后,就对该字符串进行分析,首先从开始符号分析,所以首先调用E()函数,在E () 函数中会调用T ()和G()就是每个非终结符的候选式中出现了哪个非终结符就调用哪个函数。所以,将字符串的第一个字符和E中的每个候选式匹配,如果成功就匹配输入字符串的下一个字符,当最后剩下的字符为''寸,匹配成功。其实这个工程就是构造一个语法树。

程序总流程图如下:

图1程序总流程图

三、关键性代码

这个工程的主要工作用五个非终结符生成的句子是否和输入字符串匹配,所以

主要的工作是函数E () , G () , T(), S()和F ()的编写。

1.对非终结符E处理的函数E()

这个函数主要是根据文法中的E->TG在E()中调用了T ()和G ()来进行递归分析,这个就是构造生成树的一个分支。

编译原理-课程设计(理工)

编译原理-课程设计(理工)
else if(syn==27)
{ scaner(); /*读下一个单词符号*/
expression(); /*调用函数statement();*/
if(syn==28)
scaner(); /*读下一个单词符号*/
else { printf("the error on '('\n");
kk=1;
}
}
}
term()
{ factor();
while((syn==15)||(syn==16))
{ scaner(); /*读下一个单词符号*/
factor(); /*调用函数factor(); */
}
return;
}
factor()
{ if((syn==10)||(syn==11)) scaner();
{ while(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A'))||((ch>='0')&&(ch<='9')))
{token[m++]=ch;
ch=prog[p++];
}

编译原理实验二递归下降子程序

编译原理实验二递归下降子程序

根据某一文法编制调试递归下降分析程序,以便对任意输入的符号串进行分析。#include<stdio.h>

#include<stdlib.h>

#define N 20

char Str[N]; /* 用于存放输入的字符串 */

int i=0;

int max=0; /* 输入字符串的长度下标 */

int curr=0; /* 当前字符的下标 */

int flag=0; /* 用于标记判断过程中是否出现错误 */

void inputString(); /* 输入要分析的字符串 */

void nextChar(); /* 分析下一个字符 */

void E();

void G();

void T();

void S();

void F();

void outputResult(); /* 输出分析结果 */

void inputString()

{

printf("\n实验名:递归下降分析程序\n\n");

printf("姓名:汪茁\t学号:0904011035\t班级:09计本(4)班\n\n");

printf("文法如下:\n");

printf("(1) E->TG\n(2) G->+TG|-TG\n(3) G->ε\n(4) T->FS\n");

printf("(5) S->*FS|/FS\n(6) S->ε\n(7) F->(E)\n(8) F->i\n\n");

printf("请输入要分析的字符串(以'#'号结束):\n");

for(i=0;i<N;i++)

语法分析程序(递归下降法)

语法分析程序(递归下降法)

语法分析程序(递归下降法)

班级学号姓名:指导老师:

一. 实验目的:

1、学习语法分析的主要方法;

2、熟悉复习词法分析的方法;

3、判断表达式的正确性;

4、熟悉C语言并提高动手能力;

二. 实验内容:

用递归下降分析法编写一个用于判断数学表达式是否正确的语法分析

三.实验硬件和软件平台:

INTEL C433MHz Cpu

128Mb SDRAM

Turbo C 2.0

Microsoft Windows XP SP1

四.步骤和算法描述:

1.调用词法分析程序,转换表达式成为内号;

2.调用语法分析程序,判断表达式正确与否;

五.源程序:

#include <stdio.h>

#include <string.h>

#include <io.h>

#define yy swy=adv()

FILE *fp1;

char ch;

int swy;

main()

{

void CS();

int chz(char str[15]);

int adv();

void CT();

void E(); void EB();

void ERROR();

void ET();

void F();

void IT();

void T();

void sentence();

clrscr();

ch=' ';

fp1=fopen("pas.txt","r");

if(!fp1){printf("Can not open ljx.txt!!\n”); exit(0);}

/* while(!feof(fp1)) */

{

yy;

sentence();

编译原理之递归下降语法分析程序(实验)

编译原理之递归下降语法分析程序(实验)

编译原理之递归下降语法分析程序(实验)

⼀、实验⽬的

利⽤C语⾔编制递归下降分析程序,并对简单语⾔进⾏语法分析。

编制⼀个递归下降分析程序,实现对词法分析程序所提供的单词序列的语法检查和结构分析。

⼆、实验原理

每个⾮终结符都对应⼀个⼦程序。

该⼦程序根据下⼀个输⼊符号(SELECT集)来确定按照哪⼀个产⽣式进⾏处理,再根据该产⽣式的右端:

每遇到⼀个终结符,则判断当前读⼊的单词是否与该终结符相匹配,若匹配,再读取下⼀个单词继续分析;不匹配,则进⾏出错处理每遇到⼀个⾮终结符,则调⽤相应的⼦程序

三、实验要求说明

输⼊单词串,以“#”结束,如果是⽂法正确的句⼦,则输出成功信息,打印“success”,否则输出“error”,并指出语法错误的类型及位置。例如:

输⼊begin a:=9;b:=2;c:=a+b;b:=a+c end #

输出success

输⼊a:=9;b:=2;c:=a+b;b:=a+c end #

输出‘end' error

四、实验步骤

1.待分析的语⾔的语法(参考P90)

2.将其改为⽂法表⽰,⾄少包含

–语句

–条件

–表达式

E -> E+T | T

T -> T*F | F

F -> (E) | i

3. 消除其左递归

E -> TE'

E' -> +TE' | ε

T -> FT'

T' -> *FT' | ε

F -> (E) | i

4. 提取公共左因⼦

5. SELECT集计算

SELECT(E->TE) =FIRST(TE')=FIRSI(T)-FIRST(F)U{*}={(, i, *}

实验三 递归下降分析程序实现

实验三 递归下降分析程序实现

实验三递归下降分析法

一、实验目的:

根据某一文法编制调试递归下降分析程序,以便对任意输入的符号串进行分析。本次实验的目的主要是加深对递归下降分析法的理解。

程序比较复杂,需要利用到程序设计语言的知识和大量编程技巧,递归下降分析法是一种较实用的分析法,通过这个练习可大大提高软件开发能力。通过练习,掌握函数间相互调

用的方法。

二、实验要求

1.模块设计:将程序分成合理的多个模块(函数),每个模块做具体的同一事情。

2.写出(画出)设计方案:模块关系简图、流程图、全局变量、函数接口等。

3.编程时注意编程风格:空行的使用、注释的使用、缩进的使用等。

三、实验内容

程序输入/输出示例:

对下列文法,用递归下降分析法对任意输入的符号串进行分析:

(1)E-TG

(2)G-+TG|—TG

(3)G-ε

(4)T-FS

(5)S-*FS|/FS

(6)S-ε

(7)F-(E)

(8)F-i

输出的格式如下:

(1)递归下降分析程序,编制人:姓名,学号,班级

(2)输入一以#结束的符号串(包括+—*/()i#):在此位置输入符号串例如:i+i*i#

(3)输出结果:i+i*i#为合法符号串

备注:输入一符号串如i+i*#,要求输出为“非法的符号串”。

引用也要改变)。

注意:1.表达式中允许使用运算符(+-*/)、分割符(括号)、字符I,结束符#;

2.如果遇到错误的表达式,应输出错误提示信息(该信息越详细越好);

3.对学有余力的同学,可以详细的输出推导的过程,即详细列出每一步使用的产生式。

四、实验学时

4学时

五、实验步骤

(一)准备:

1.阅读课本有关章节,

递归子程序递归

递归子程序递归

递归子程序

一个过程或函数,如果在说明中出现对这个函数或过程本身的调用时,称这个函数或过程是递归函数或递归过程。

注意:

(1) 递归就是在过程或函数里调用自身;

(2) 在使用递增归策略时,必须有一个明确的递归结束条件,称为递归出口。

1、直接递归

Procedure a(x:integer);

begin

a(30);

end;

直接递归是在过程或函数中直接调用自己。上面说明过程a中又出现了过程调用a(30)。

2、间接递归

procedure a(x:integer);

begin

b(y);

end;

procedure b(x:char);

begin

a(m);

end;

间接递归是通过调用其他过程或函数来调用自己。上面说明过程a中出现了过程调用b(y),而过程b 中又出现了调用过程a(m)。

从简单起见,本课只介绍直接递归。

例1:求n!的递归子程序。

因为N!=1*2*3*4*……*n=[1*2*3*...*(N-1)]*N

而(N-1)!=1*2*3*...*(N-1)

所以N!=N*(N-1)!,则要求n!,只要先求(n-1)!,而(n-1)!与n!的计算方法是一样的,只不过缩小了计算范围。

由此可知(N-1)!=(N-1)*(N-2)!

(N-2)!=(N-2)*(N-3)!

…………

3!=3*2!

2!=2*1!

1!=1*0!

而数学中定义0!=1。

设 f(N)=N!

那么 f(N-1)=(N-1)!

则 f(N)=f(N-1)*N 这就是递归式子

概括得到

1

N=0

F(N)=

N*f(N-1) N>0

递归下降程序

递归下降程序

递归下降分析程序实验报告

1.实验内容

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

算术表达式文法如下:

E→E+T | T

T→T*F | F

F→(E) | i

2.实验分析

(1 ) 对所给表达式进行分析,如果是左递归则对算术表达式进行改写消除其左递归。改写的算术表达式如下:

E→TE’

E’→+TE’| ε

T→FT’

T’→*FT’ | ε

F→(E) | i

( 2) 写出上面表达式的FIRST集和FOLLOW集,然后对有多个规则的FIRST集求并集,看是否等于空集;对规则右部出现空串的FIRST集与FOLLOW集求并集,看是否等于空集。

对E’:FIRST(+TE′) ∩FOLLOW(E′)={+,ε} ∩{#, )}=Φ

对T’:FIRST(*FT′) ∩FOLLOW(T′)={*,ε} ∩{+,#, )}=Φ

对F:FIRST(i) ∩FIRST( (E) )={i} ∩{ ( }=Φ

故由上面可知此改写后的文法是LL(1)文法。

(3)对上述LL(1)文法编程。编程规则如下:

①当遇到终结符a时,则编写语句

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

②当前遇到非终结符A时,则编写语句调用A()。

③当前遇到A→ε规则时,则编写语句

If(当前读来的输入符号不属于FOLLOW(A))error()

④当某个非终结符的规则有多个候选式时,按LL(1)文法的条件能惟一地选择一个侯选式进行推导。

3.源程序代码

#include<iostream>

using namespace std;

#include<string>

编译原理-递归下降子程序-课程设计报告

编译原理-递归下降子程序-课程设计报告

编译原理课程设计报告

2011 年 12 月 2 日

设计题目 递归下降分析程序的实现 学

专业班级 计算机科学与技术

学生姓名

指导教师

一、实验目的:

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

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

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

二、实验内容:

递归下降分析程序的实现

设计内容及要求:

对文法 G: E→E+T|T构造出G的递归下降分析程序。程序显示输出T→T*F|F匹配过程(即自上而下生成语法分析树的步骤,

F→(E)|i 输出各匹配产生式序号即可)。

三、设计思路:

(1)语法分析:

语法分析是编译程序的核心部分,任务是分析一个文法的句子结构。递归下降分析程序的实现的功能:按照文法的产生式(语言的语法规则),识别输入符号串是否为一个句子(合式程序)。

(2)自上而下分析:

从文法的开始符号出发,向下推导,推出句子。可分为带“回溯”的和不带回溯的递归子程序(递归下降)分析方法。

它的主旨是对任何输入串,试图用一切可能的办法,从文法开始符号(根结点)出发,自上而下地为输入串建立一棵语法树。或者说,为输入串寻找一个最左推导。也即从文法的开始符号出发,反复使用各种产生式,寻找"匹配"的推导。

(3)递归下降分析法:

对每一语法变量(非终结符)构造一个相应的子程序,每个子程序识别一定的语法单位,通过子程序间的信息反馈和联合作用实现对输入串的识别。

(4)分析过程中遇到的问题:

a. 分析过程中,当一个非终结符用某一个候选匹配成功时,这种匹配可能是暂时的。出错时,不得不“回溯”。

b.文法左递归问题。含有左递归的文法将使自上而下的分析陷入无限循环。

编译原理语法分析—自上而下分析

编译原理语法分析—自上而下分析
若X→Y1Y2…Yk是一个产生式,Y1,…,Yi-1都 是非终结符,而且,对于任何j,1ji-1, FIRST(Yj)都含有(即Y1…Yi-1), 则把 FIRST(Yi)中的所有非-元素都加到 FIRST(X)中;特别是,若所有的FIRST(Yj) 均含有,j=1,2,…,k,则把加到 FIRST(X)中。
END
3. 化简由2所得的文法。去除那些从开始符号出发 永远无法到达的非终结符的产生规则。
例 考虑文法G(S)
S→Qc|c Q→Rb|b R→Sa|a
令它的非终结符的排序为R、Q、S。 对于R,不存在直接左递归。 把R代入到Q的有关候选后,把Q的规则变
为 Q→Sab | ab | b
现在的Q不含直接左递归,把它代入到S的有关 候选后,S变成
其中,每个都不等于,每个都不以P开头
那么,消除P的直接左递归性就是把这些 规则改写成:
P→1P | 2P | … | nP P→1P | 2P |… | mP |
例 文法G(E): E→E+T | T T→T*F | F F→(E) | i
经消去直接左递归后变成:
例 文法G(E): E→E+T | T
那么,可以把这些规则改写成 A→A | 1 | 2 | … | m
A→ 1 | 2 | … | n 经过反复提取左因子,就可能够把每个非
终结符(包括新引进者)的所有候选首符集 变成为两两不相交。

递归子程序

递归子程序

百度文库
文法:s->a|^|(T) T->ST‟ T‟->,ST‟|ε Main () {scaner(); S();if (sym==„#‟) printf(“success”);else{“fail); } S() {if (sym==„a‟||sym==„^‟) scaner(); else if (sym==„(‟){scaner();T(); if (sym==„)‟)scaner();else error(); } else error(); } T() {s();T‟();} T‟() {if (sym==„,‟){scaner();S();T‟();} else if (sym!=„)‟) error(); }
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验4 递归下降子程序的编写

一、实验目的

通过本实验,了解递归下降预测分析的原理和过程以及可能存在的回溯问题,探讨解决方法,为预测分析表方法的学习奠定基础。分析递归下降子程序的优缺点。

二、实验准备

1.预习自上而下语法分析小节的内容;

2.学生自己考虑使用的开发环境,如VC++,熟悉开发环境。

三、实验内容

下列文法中选做一题:

1.针对算术表达式文法:E→TE’

E’→ +TE’|ε

T→FT’

T’→*FT’ |ε

F→(E) |i

为其编写递归下降子程序,判定某个算术表达式是否正确:如j+k*m,j*k+m

输入:其输入数据应该为词法分析器输出的记号形式:i+i*i,i*i+i

输出:分析结果:算术表达式结构正确或结构错误。

2.给定文法(PASCAL语言标识符定义文法)(选做)

type→simple|↑id|array[simple] of type

Simple→integer|char|num dotdot num

其中:dotdot表示..

编写递归下降子程序,判定一个句子结构是否正确:array [3..5]of integer 输入:其输入数据应该为词法分析器输出的单词序列:array[num dotdot num] of integer

输出:分析结果

四、实验要求

1.编写程序调试运行;考虑如果将你的程序改为识别其他的文法,你的递归下降子程序可否通用,考虑递归下降子程序方法的优缺点。

2.撰写实验报告:实验名称、实验目的、实验内容、实验结果、结果分析

五、实验时间

第七周周三2单元上机地点:软一

相关文档
最新文档