自上而下的语法分析

自上而下的语法分析
自上而下的语法分析

第4章自上而下的语法分析

从文法的开始符号出发进行推导,最终推出确定的输入串(由单词种别构成的源程序)。

4.1 带回溯的自上而下分析法概述

从根结点出发,试图用一切可能的办法,自上而下地为输入串建立一棵语法树。或者说,为输入串寻找一个最左推导。

㈠分析过程概述

例已知文法G:

S→xAy

A→**|*

和输入串α=x*y。

①初始时,指示器P指向α的第一个符号x。

S x * y

②从S推导,因最左子结和输入串第一个符号相匹配,故指示器P指向下一符号*。

S

x * y

x A y

③因第二个子结是非终结符A,从A采用第一个候选进行推导。从A推导出的左子结和指示器P所指的符号一致,故P指向下一个符号y。

S

x *y

x A y

**

④因A的第二个子结*和指示器P所指的符号不一致,这意味着A的第一个候选不适用于构造α的语法树,应该回溯。将A的子树注销,P恢复进入A时的值。

S

x * y

x A y

⑤用A的第二个候选进行推导,因子树A的子结和指示器P所指的符号*一致,则P 指向下一个符号y。

S

x * y

x A y

*

⑥因S的第三个子结和指示器P所指的符号一致,故α是一个句子。

显然上述分析过程本质上是一个试探过程,是反复使用不同产生式谋求匹配输入串的过程。

㈡问题和困难

①对于左递归文法定义的语言,不能采用自上而下的语法分析法。

例已知左递归文法G:S→Sb∣a和输入串α=ab,其分析过程如下所示:

S ab

S b

.... b

试图用非终结去推导匹配输入串,而推导所得到的子树第一个子结是该非终结符本身,这样就陷入了死循环。

②存在虚假匹配,回溯不可避免。

③编译程序的语法分析和语义分析通常是同时进行的。由于回溯,编译程序所做的一大堆语义分析工作必须推倒重来。

④当选用所有的不同候选组合,都不能为输入串建立一棵语法树,那么输入串存在语法错误。这种分析法最终只能告知输入串不是文法的一个句子,而无法告知输入串错在何处。

⑤带回溯的自上而下分析法实际上是一种穷尽一切可能的试探法,因此效率很低,这种分析法几乎没有实用价值。

4.2 直接左递归的消除

㈠实例引入

例:已知左递归文法G:S→Sa|b,构造文法G的等价文法G',G'不含左递归。

解:文法G'如下所示

S→bS'

S'→aS'|ε

∵S Sa Saa … ba n 或S b

∴L(G)={ ba n∣n≥0}

∵S bS' baS' … ba n 或S b S' b

∴L(G')={ ba n∣n≥0}

∵L(G)= L(G')

∴文法G和G'等价,而文法G'不含左递归。

㈡直接左递归消除方法

假定关于非终结符P的规则为

P→Pα|β

其中,β不以P开头。可以把关于P的规则变换为如下形式:

P→βP'

P'→αP'|ε

由于二者推导出的句型均为βαn(n≥0),故上述变换是等价的。

例文法G

E→E+T|T

T→T*F|F

F→(E)|i|x|y

经消除直接左递归后变成

E→TE'

E'→+TE'|ε

T→FT'

T'→*FT'|ε

F→(E)|i|x|y

㈢直接左递归消除一般规则及等价性证明

4.3 不带回溯的自上而下分析法的基本原理

设文法G有产生式

A→α1|α2|…|αn

㈠带回溯的自上而下的分析法

采用试探法,对于α1、α2直至αn逐一试探。

㈡不带回溯的自上而下的分析法

在推导时,根据面临的输入符号去找出A的那个唯一正确的候选式。

①引入候选式α的first集定义

②根据定义,求出每个候选式αi的first集。

③根据当前输入符号,选择候选式进行推导。

④进一步考虑(A→ε)

⑤引入非终结符follow集定义

⑥修改分析算法

4.4 提取左因子

㈠实例引入

例定义无符号整数的文法

N→DN|D

D→0|1|2|3|4|5|6|7|8|9|0

就是这样一种情形,first(DN)∩first(D)={D}。

㈡解决方法

提取左因子,引进ε产生式,将文法改造为G'。

N→DN'

N'→N|ε

D→0|1|2|3|4|5|6|7|8|9|0

㈢提取左因子一般规则

4.5 first集和follow集

4.5.1 first集的定义及构造算法

㈠first集定义

α是文法G的任一符号串(包括候选式),α∈(V T∪V N)*

first(α)={a∣α a……,a∈V T}

若α ε,则规定ε∈first(α)。

㈡文法符号first集构造算法

①终结符的first集为终结符本身。

②观察每个产生式,若有X→a……,其中a∈V T,则a∈first(X);若X→ε,则ε∈first(X)。

③观察每个产生式,若有X→Y……,其中Y∈V N,则将first(Y)中的非ε元素(记为

first(Y)/ε)加到first(X)中。

考虑更一般情况,X→Y1Y2…Y i…Y n,其中Y1、Y2、…Y i-1∈V N。

●若first(Y1)中含有ε,则将first(Y2)/ε加到first(X)中,否则终止计算。

●若first(Y1)和first(Y2)中含有ε,则将first(Y3)/ε加到first(X)中,否则终止计算。

●若first(Y1)、first(Y2)、…first(Y i-1)均含有ε,即Y1Y2…Y i-1 ε,则把first(Y i)/

ε加到first(X)中,否则终止计算。

●若所有first(Y j) 均含有ε(1≤j≤n),即Y1Y2…Y n ε,则ε∈first(X)。

反复使用规则③,直至每个非终结符的first集不再增长为止。

例,文法G如下所示, 求文法符号的first集。

E→TE'

E'→+TE'|ε

T→FT'

T'→*FT'|ε

F→(E) | i | x | y

设A→α,α=X1X2…X n,计算规则如下所示:

①置first(α)=first(X1)/ε。

②若ε∈first(X1),则把first(X2)/ε加至first(α)中;若ε∈first(X1)且ε∈first(X2),则

把first(X3)/ε加至first(α);……;依次类推。

③若所有的first(X i)均含有ε,其中1≤i≤n,则ε∈first(α)。特别当α=ε,则

first(α)={ε}。

接上例,求文法G候选式的first集:

E→TE' first(TE')=first(T) /ε={(,i,x,y}

E'→+TE'|εfirst(+TE')={+},first(ε)={ε}

T→FT' first(FT')=first(F) /ε={(,i,x,y}

T'→*FT'|εfirst(*FT')={*},first(ε)={ε}

F→(E)|i|x|y first((E))={( }、first(i)={i}、first(x)={x}、first(y)={y}

㈣任一文法符号串的first集构造算法

设A→X1X2…X i-1X i X i+1…X n,求X i X i+1…X n的first集。

令ɑ= X i X i+1…X n,参照㈢即可。

4.5.2 follow集的定义及构造算法

㈠follow集定义

设S是文法开始符号,对于文法的任何非终结符A

follow(A)={a∣S …Aa…,a∈V T }

特别是,若S …A,规定#∈follow(A)。

㈡follow集构造算法

①对于文法开始符号S,因为S S,故#∈follow(S)。

②观察每个产生式,若A→αBβ,其中B∈V N,α∈(V T∪V N)*、β∈(V T∪V N)+,则把first(β)/ε加至follow(B)。

③观察每个产生式,若A→αB或A→αBβ(β ε),则把follow(A)加至follow(B)。反复使用第③条规则,直至每个非终结符的follow集不再增长为止。

例,文法G如下所示,求非终结符的follow集。

1.E→T E' first(E') /ε={ + }

2.E'→+TE'

3.E'→ε

4.T→FT' first(T') /ε={ * }

5.T'→*FT'

6.T'→ε

7.F→(E) first( ) )={)}

8.F→i

9.F→x

10.F→y

4.6 递归下降分析法

递归下降分析法思想是:让每个非终结符对应一个过程(函数)。根据上述文法,构造递归下降分析程序,程序用类C语言描述。

struct code_val{

char code;char val[20];

} t; //定义结构变量,存放单词二元式。

ifstream cinf("lex_r.txt",ios::in); //从文件lex_r.txt输入数据

void E( ) // E→TE'

{

T;E';

}

void E'( )// E'→+TE'|ε

{

if (t.code=='+'){

cinf>>t.code>>t.val;//读一个单词的二元式

T;E';

}

}

void T( )// T→FT'

{

F;T';

}

void T'( )// T'→*FT'|ε

{

if (t.code=='*'){

cinf>>t.code>>t.val;//读一个单词的二元式

F;T'

}

}

void F( )// F→(E) | i | x | y

{

if (t.code=='('){

cinf>>t.code>>t.val;//读一个单词的二元式

E;

if (t.code==')') cinf>>t.code>>t.val;//读一个单词的二元式

}

else if (t.code=='i'|| t.code=='x'|| t.code=='y')

cinf>>t.code>>t.val;//读一个单词的二元式

}

void main( )

{

cinf>>t.code>>t.val; //读一个单词的二元式

E;

}

源程序经词法分析,改造为单词二元式序列形式,存放于文件lex_r.txt中。递归下降分析器从文件lex_r.txt读入数据进行处理。

4.7 预测分析法

㈠预测分析法基本原理

产生式的一般形式为:

A→α1|α2|…|αn|ε

设当前输入符号为a,根据下述原则

if (a∈first(αi))

用A→αi推导(1≤i≤n)

else if (a∈follow(A))

用A→ε推导

else

报错

构造分析表如下

以输入串“i + i#”为例,说明工作原理如下:

E TE' FT'E' iT'E' iE' i+TE' i+FT'E' i+iT'E' i+iE' i+i

i i i + + i i # #

㈡分析表构造规则

①构造所有候选式的first集,构造所有非终结符的follow集。

②对于文法的每个产生式A→α执行③和④。

③对于每个终结符a∈first(α),把A→α加至M[A][a]。

④若ε∈first(α),则对于每个终结符b∈follow(A),把A→α加至M[A][b]。

⑤把所有未定义的M[A][c]标上“出错标志”(c∈V T)。

㈢预测分析控制程序实现

①数据结构

M:二维数组,存放预测分析表。

stack:符号栈,初始时为"#S"(S为开始符号)。

X:表示栈顶符号

t.code:当前处理单词种别

②算法描述

预测分析控制程序任何时刻的动作,都按照栈顶符号X和当前输入符号t.code行事,控制程序每次执行下述三种可能的动作之一(暂不考虑出错情况)。

●若X 和t.code 均为'#',则分析成功,输入串为合法句子,终止分析过程。

●若X是终结符,并且X和t.code相等,表示期望的终结符号和输入符号相等。

让X出stack栈,并输入下一个单词二元式。

●若X是非终结符,则查预测分析表。若M[X][t.code]存放着一条关于X的一

个产生式,那么,让X出stack栈,然后把产生式右部符号串按反序一一推进

stack栈。若右部符号串为空字ε,则意味着无任何文法符号进栈。

㈣预测分析法讨论

①预测分析法是由分析表和控制程序构成的,控制程序与文法无关,分析表随文法而异。

②在预测分析表中,若某一单元持有一个以上产生式,则称该预测分析表含多重定义,多重定义使得控制程序无法工作。

③一个文法,若它的预测分析表不含多重定义,则称该文法是LL(1)文法、分析表为LL(1)分析表。

④一个文法是LL(1)的,对于文法的每一个非终结符的任何两个不同候选式(A→α|β),下述条件成立:

●first(α)∩first(β)={}

●若β ε,则first(α)∩follow(A)={}

⑤二义文法不是LL(1)文法

㈤二义文法在预测分析法中的应用

实验三 自下而上语法分析及语义分析

实验三自下而上语法分析及语义分析 一、实验目的: 通过本实验掌握LR分析器的构造过程,并根据语法制导翻译,掌握属性文法的自下而上计算的过程。 二、实验学时: 4学时。 三、实验内容 根据给出的简单表达式的语法构成规则(见五),编制LR分析程序,要求能对用给定的语法规则书写的源程序进行语法分析和语义分析。 对于正确的表达式,给出表达式的值。 对于错误的表达式,给出出错位置。 四、实验方法 采用LR分析法。 首先给出S-属性文法的定义(为简便起见,每个文法符号只设置一个综合属性,即该文法符号所代表的表达式的值。属性文法的定义可参照书137页表6.1),并将其改造成用LR分析实现时的语义分析动作(可参照书145页表6.5)。 接下来给出LR分析表。 然后程序的具体实现: ●LR分析表可用二维数组(或其他)实现。 ●添加一个val栈作为语义分析实现的工具。 ●编写总控程序,实现语法分析和语义分析的过程。 注:对于整数的识别可以借助实验1。 五、文法定义 简单的表达式文法如下: E->E+T|E-T|T T->T*F|T/F|F F->(E)|i 上式中,i 为整数。 六、处理程序例 例1: 正确源程序例: 23+(45+4)* 40分析结果应为:正确的表达式。其值为:1983 例2: 错误源程序例: 5+(56+)-24 分析结果应为:错误的表达式:出错位置为)

附录:源程序 #include #include"string.h" #include using namespace std; #define R 30 #define C 20 typedef struct elem { char e[4]; }Elem; //ACTION表与GoTo表中的元素类型 Elem LR[R][C]; //存放ACTION表与GoTo表中的内容 typedef struct out { int order; //序号 int state[10]; //状态栈 char sign[30]; //符号栈 char grasen[20]; //产生式 char input[30]; //输入串 char explen[50]; //解释说明 }OutNode; //输出结果中每一行的类型 OutNode out[20]; //存放输出结果 char Sentence[20]; //存放文法的一个句子 char GramSent[10][20]; //存放文法的一组产生式

语法分析(自上而下分析)实验报告

实习二语法分析-自上而下分析 一、实验目的 使用预测分析方法对输入的表达式进行分析,掌握其具体的使用并且学会去分析一个文法。 二、实验内容 1.设计表达式的语法分析器算法(使用预测分析) 2.编写一段代码并上机调试查看其运行结果 三、实验要求 使用LL(1)分析算法设计表达式的语法分析器 LL(1)文法是一个自上而下的语法分析方法,它是从文法的开始符号出发,生成句子的最左推导,从左到右扫描源程序,每次向前查看一个字符,确定当前应该选择的产生式。 实现LL(1)分析的另一种有效方法是使用一张分析表和一个栈进行联合控制。 预测分析程序的总控程序在任何时候都是按STACK栈顶符号X和当前a的输入符号行事的。对于任何(X,a),总控程序每次都执行三种可能的动作之一。 1.若X=a=“#”,则宣布分析成功,停止分析过程 2.若X=a≠“#”,则把X从STACK栈顶逐出,让a指向下一 个输入符号。 3.若X是一个非终结符,则查看分析表。 四、运行结果

(本程序只能对由'i','+','*','(',')'构成的以'#'结束的字符串进行分析) 五、源程序实现 /*LL(1)分析法源程序,只能在VC++中运行*/ #include #include #include #include char A[20]; char B[20]; char v1[20]={'i','+','*','(',')','#'};/*终结符*/ char v2[20]={'E','G','T','S','F'};/*非终结符*/ int j=0,b=0,top=0,l;/*L为输入串长度*/

自顶向下的语法分析(实验报告一)

武汉轻工大学 编译原理实验报告 姓名朱春桃 院(系)数学与计算机学院 班级软件工程1203 学号 1205110605 指导教师李禹生 2014 年11 月10 日

一、实验目的 完成自顶向下语法分析算法的程序设计。 二、实验内容 设计、调试并测试自顶向下语法分析算法程序。 三、设计思路 根据课堂讲授的自顶向下语法分析方法,可以根据递归下降子程序方法设计语法分析程序,也可以根据LL(1)算法设计语法分析程序,针对文法:G[E] E→E+T | T T→T*F | F F→( E ) | i (1)由于文法G[E]不满足LL(1)文法条件,需要进行必要的等价文法变换。变换后的等价文法为: H[E] E→TA A→+TA | ε T→FB B→*FB | ε F→( E ) | i (2)等价文法H[E]不含左递归,可以证明文法H[E]满足LL(1)文法条件(3)根据递归下降子程序方法设计语法分析程序 ①递归程序清单 ②调试过程说明 ③测试语句设计 ④测试结果列表 ⑤测试结论分析 (4)根据LL(1)算法设计语法分析程序 ①预测分析表 ②预测分析程序清单 ③调试过程说明 ④测试语句设计 ⑤测试结果列表

⑥测试结论分析 四、程序清单 /* E->TA, A->+TA|ε, T->FB, B->*FB|ε, F->i|(E). */ #include void E(char str[80],int &i,int &err or); void A(char str[80],int &i,int &error); void T(char str[80],int &i,int &error); void B(char str[80],int &i,int &error); void F(char str[80],int &i,int &error); void main() { int i=0,j=0,error=0; char str[80]; printf("请输入字符串('#'为结束字符):"); while ((str[j]=getchar())!='#') j++; str[j]='#'; E(str,i,error); if(error) printf("error\n"); else printf("right\n"); } void E(char str[80],int &i,int &error) { printf("E->TA\n"); T(str,i,error); A(str,i,error); } void A(char str[80],int &i,int &error) { if(str[i]=='+') { printf("A->+TA|ε\n"); i++; T(str,i,error); A(str,i,error);

第五章 自上而下语法分析

第五章自上而下语法分析 1、教学目的及要求: 本章介绍编译程序的第二个阶段语法分析的设计方法和实现原理,包括自上而下分析的无回朔的递归下降分析、 LL(1)分析法。要求理解递归下降分析、LL(1)文法的基本概念;掌握无回朔的递归下降分析的设计和实现、LL(1)分析表的构造与分析方法。 ◇能够对一个给定的文法判断是否是LL(1)文法; ◇能构造预测分析表; ◇能用预测分析方法判断给定的输入符号串是否是该文法的句子; ◇能对某些非LL(1)文法做等价变换: ①消除左递归 ②提取左公共因子 可能会变成LL(1)文法。这样可扩大自顶向下分析方法的应用。 2、教学内容: 语法分析器的功能,自上而下语法分析(递归下降分析法,预测分析程序),LL(1)分析法,递归下降分析程序构造,预测分析程序。 3、教学重点: 递归下降子程序,预测分析表构造,LL(1)文法。 4、教学难点: 对一个文法如何判断是否是LL(1)文法,由于在判断 LL(1)文法时用到文法符号串的开始符号集合(FIRST集)和非终结符后跟符号集合(FOLLOW集)的计算,而一般学生往往因概念不清或不够细心对这两个集合的计算常常出错,导致判断和分析结果的错误。 5、课前思考 为了了解自顶向下(自上而下)分析的一般过程和问题,请学生首先回顾本章之前介绍的有关基本概念: ◇句子、句型和语言的定义是什么? ◇什么叫最左推导? ◇什么叫最右推导和规范推导? ◇什么叫确定的自顶向下语法分析?

◇自顶向下语法分析是从文法的开始符号出发,反复使用各种产生式,寻找与输入符号匹配的推导。 ◇确定的自顶向下语法分析中用的是哪种推导? ◇在确定的自顶向下语法分析过程中,当以同一个非终结符为左部的产生式有多个不同右部时,如何选择用哪个产生式的右部替换当前的非终结符? ◇确定的自顶向下语法分析对文法有何限制? 6、章节内容 第一节概述 第二节 LL(1)分析方法 第三节递归下降分析法 5.1 概述 LL分析法 确定的自上而下分析 自上而下分析递归下降分析法 语法分析不确定的自上而下分析——即带回溯的分析方法 算符优先分析 自下而上分析 LR分析 一、带回溯的自顶向下分析方法 是自顶向下分析的一般方法,即对任一输入符号串,试图用一切可能的办法,从树根结点(识别符号)出发,根据文法自上而下地为输入串建立一棵语法树,或者说,从识别符号开始,根据文法为输入串建立一个推导序列,这种分析过程本质上是一种试探过程,是反复使用不同规则谋求匹配输入串的过程。 例有文法G[S]:S→cAd,A→ab|a,输入串w=cad。其分析过程为带回溯的。 二、存在问题及解决办法 1、左递归问题: 自顶向下分析方法只有把规则排列得合适时才能正确工作,该方法不能处理具有左递归性文法,可采取某些算法消除左递归。 2、回溯问题:

编译原理 第四章自顶向下语法分析法

第四章 自顶向下语法分析方法 语法分析是编译过程的核心部分。语法分析的任务是:按照文法,从源程序符号串中识别出各类语法成份,同时进行语法检查,为语义分析和代码生成作准备。执行语法分析任务的程序称为分析程序。也称为语法分析器,它是编译程序的主要子程序之一。 在第二章中我们已经介绍过。通过语法分析可建立起相应的语法树。按语法树的建立方法,我们将语法分析方法分成两大类,即自顶向下分析和自底向上分析。下面,我们先介绍自顶向下分析。 本章重点:自顶向下分析、LL (1)分析 第一节 自顶向下分析方法 一、带回溯的自顶向下分析算法 这是自顶向下分析的一般方法,即对任一输入符号串,试图用一切可能的方法,从识别符号出发,根据文法自上而下地为输入串建立一棵语法树。 下面用一个简单例子来说明这种过程: 假定有文法G[S]: S→c Ad A →ab|a 以及输入串w=cad 为了自上而下地构造w 的语法树,我们首先按文法的识别符号产生根结点S ,并让指示器IP 指 c S 的规则仅有一条)把这棵树发展为 ( a ) (b ) (c ) 图3-1-1 图3-1-1a 。我们希望用S 的子结从左至右匹配整个输入串w 。首先,此树的最左子结是终结符c 为标志的子结,它和输入串的第一个符号相匹配。于是,我们就把IP 调整为指向下一输入符号a ,并让第二个子结A 去进行匹配,非终结符A 有二个选择,我们试着用它的第一个选择去匹配输入串,于是把语法树发展为图3-1-1b 。子树A 的最左子结和IP 所指的符号相符,然后我们再把IP 调为指向下一符号d 并让A 的第二个子结进入工作。但A 的第二个子结为终结符号b ,与IP 当前指的符号d 不一致。因此,A 宣告失败。这意味着A 的第一个选择此刻不适用于构造w 的语法树。这时,我们应该回头(回溯)看A 是否还有别的选择。 为了实现回溯,我们一方面应把A 的第一个选择所生长的子树注销掉;另一方面,应把IP 恢复为进入A 时的原值,也就是让它重新指向第二输入符号a 。现在我们试探用A 的第二个选择,即考虑生成图3-1-1c 的语法树。 由于子树A 只有一个子结a ,而且,它和IP 所指的符号相一致,于是,A 完成了匹配任务。在A 获得匹配后,指示器指向下一个未被触及的符号d 。 在S 的第二子结A 完成匹配后,接着就轮到第三个子结d 进行工作。由于这个子结和最后一个输入符号相符,于是,我们完成了构造语法树的任务,证明了w 是文法G[ s]的一个句子。 上述自顶向下地为输入符号w 建立语法树的过程,实际上也是设法建立一个最左推导序列,以便通过一步步推导将输入串推导出来。很明显,对于输入串w 可以通过如下的推导过程将其推导出来:S ?CAd ?cad 所以用最左推导,是因为我们对输入串是自左向右扫描的,只有使用最左推导,才能保证按扫描顺序去匹配输入串。在上述推出符号串w 的过程中,由于出现在符号串中的非终结符号只有一个,因此,未明显地表现出最左推导的性质。 根据以上分析,不难编出程序来实现这种分析的算法。但是,上述这种自顶向下的分析算法存

语法分析-自上而下分析

第四章语法分析—自上而下分析 知识结构: 带回溯分析法 回溯 自上而下分析面临的问题 左递归 问题的解决 语法分析-求FIRST、FOLLOW集合的算法自上而下分析LL(1)分析法证明LL(1)文法 构造LL(1)分析表 递归子程序的构造思想 递归子程序法递归子程序的特点 递归子程序的设计 第一节语法分析综述 一、语法分析的任务 按照语言即定的语法规则,对字符串形式的源程序进行语法检查,并识别出相应的语法成分。即语法结构是否符合语法规则。 二、语法分析器在编译程序中的地位(一遍扫描)

三、语法分析方法 通常把语法分析方法分为两大类,既自上而下分析与自下而上分析。 1、自上而下分析方法 实际上是一种产生的方法,分析过程是一个推导过程。 ⑴自上而下分析过程 从文法G的开始符号S出发,通过反复使用产生式,逐步推导出与输入的符号串完全相匹配的句子。采用最左推导,以文法开始符号为根结点,逐步为输入串自上而下地构造一棵语法树。 面临的输入符号为a,A所有的产生式: A12n ①若a FISRT(i),则指派去执行匹配任务。 ②若a不属于任何一个候选首字符集,则: a、若属于某个FISRT(i)且a FOLLOW(A),则让A 与自动匹配; b、否则,a的出现是一种错误。 例:设有文法G和输入符号串W:a*a+a G:S aA a A BaA

B +-*/ 推导过程: S aA aBaA a*aA a*aBaA a*a+aA a*a+a=W 构造语法树: S a A B a A * B a A + ⑵自上而下分析法 自上而下分析法又可分为确定和不确定的两种。 ①不确定的分析法(带回溯) 是一种穷举的试探方法,效率低、代价高,极少使用。 ②确定的分析法(不带回溯) 实现方法简单、直观,便于手工构造或自动生成语法分析器,是目前常用的方法之一。但是对文法有一定的限制。 2、自下而上分析法 ⑴自下而上分析过程 分析过程是归约过程。从给定的输入串W开始,不断寻找与文法G中某个产生式P的侯选式(右部)进行匹配,并用P代替也称为归约。 ⑵自下而上分析法

编译原理实验三-自下而上语法分析及语义分析.docx

上海电力学院 编译原理 课程实验报告 实验名称:实验三自下而上语法分析及语义分析 院系:计算机科学和技术学院 专业年级: 学生姓名:学号: 指导老师: 实验日期: 实验三自上而下的语法分析 一、实验目的: 通过本实验掌握LR分析器的构造过程,并根据语法制导翻译,掌握属性文法的自下而上计算的过程。 二、实验学时: 4学时。 三、实验内容

根据给出的简单表达式的语法构成规则(见五),编制LR分析程序,要求能对用给定的语法规则书写的源程序进行语法分析和语义分析。 对于正确的表达式,给出表达式的值。 对于错误的表达式,给出出错位置。 四、实验方法 采用LR分析法。 首先给出S-属性文法的定义(为简便起见,每个文法符号只设置一个综合属性,即该文法符号所代表的表达式的值。属性文法的定义可参照书137页表6.1),并将其改造成用LR分析实现时的语义分析动作(可参照书145页表6.5)。 接下来给出LR分析表。 然后程序的具体实现: ● LR分析表可用二维数组(或其他)实现。 ●添加一个val栈作为语义分析实现的工具。 ●编写总控程序,实现语法分析和语义分析的过程。 注:对于整数的识别可以借助实验1。 五、文法定义 简单的表达式文法如下: (1)E->E+T (2)E->E-T (3)E->T

(4)T->T*F (5)T->T/F (6)T->F (7)F->(E) (8)F->i 状态ACTION(动作)GOTO(转换) i + - * / ( ) # E T F 0 S5 S4 1 2 3 1 S6 S1 2 acc 2 R 3 R3 S7 S13 R3 R3 3 R6 R6 R6 R6 R6 R6 4 S 5 S4 8 2 3 5 R8 R8 R8 R8 R8 R8 6 S5 S4 9 3 7 S5 S4 10 8 S6 R12 S11 9 R1 R1 S7 S13 R1 R1 10 R4 R4 R4 R4 R4 R4 11 R7 R7 R7 R7 R7 R7 12 S5 S4 14 3 13 S5 S4 15 14 R2 R2 S7 S13 R2 R2 15 R5 R5 R5 R5 R5 R5 五、处理程序例和处理结果例 示例1:20133191*(20133191+3191)+ 3191#

编译原理-四章自顶向下语法分析法

第四章自顶向下语法分析方法 语法分析是编译过程的核心部分。语法分析的任务是:按照文法,从源 程序符号串中识别出各类语法成份,同时进行语法检查,为语义分析和代码生成作准备。执行语法分析任务的程序称为分析程序。也称为语法分析器,它是编译程序的主要子程序之一。 在第二章中我们已经介绍过。通过语法分析可建立起相应的语法树。按语法树的建立方法,我们将语法分析方法分成两大类,即自顶向下分析和自底向上分析。下面,我们先介绍自顶向下分析。 本章重点:自顶向下分析、LL(1)分析 第一节自顶向下分析方法 一、带回溯的自顶向下分析算法 这是自顶向下分析的一般方法,即对任一输入符号串,试图用一切可能的方法,从识别符号出发,根据文法自上而下地为输入串建立一棵语法树。 下面用一个简单例子来说明这种过程: 假定有文法G[S] : S—c A d A — ab|a 以及输入串w=cad 为了自上而下地构造w的语法树,我们首先按文法的识别符号产生根结点S, 并让指示器IP 指

向输入串的第一符号c。然后,用S的规则(此处左部为S的规则仅有一条)把这棵树发展为| (a) (b)(c) 图3-1-1 图3-1-1a。我们希望用S的子结从左至右匹配整个输入串w。首先,此树的最左子结是终结符c为标志的子结,它和输入串的第一个符号相匹配。于是,我们就把IP调整为指向下一输入符号a,并让第二个子结A去进行匹配,非终结符A有二个选择,我们试着用它的第一个选择去匹配输入串,于是把语法树发展为图3-1-1b。子树A的最左子结和IP所指的符号相符,然后我们再把IP调为指向下一符号d并让A的第二个子结进入工作。但A 的第二个子结为终结符号b,与IP当前指的符号d不一致。因此,A宣告失败。这意味着A的第一个选择此刻不适用于构造w的语法树。这时,我们应该回头(回溯)看A是否还有别的选择。 为了实现回溯,我们一方面应把A的第一个选择所生长的子树注销掉;另一方面,应把IP恢复为进入A时的原值,也就是让它重新指向第二输入符号a。现在我们试探用A的第二个选择,即考虑生成图3-1-1C的语法树。 由于子树A只有一个子结a,而且,它和IP所指的符号相一致,于是,A

习题与答案-5-语法分析-自上而下

^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 1.对文法G[S] G: S →a | ∧| (T) T →T , S | S (1) 给出(a,(a,a))和(((a,a), ∧,(a)),a)的最左推导。 (2) 对文法G,进行改写,然后对每个非终结符写出不带回溯的递归子程序。 (3) 经改写后的文法是否是LL(1)的?给出它的预测分析表。 (4) 给出输入串(a,a)#的分析过程,并说明该串是否为G的句子。 1. [解答] (1)①S ②S (T )( T ) T , S T , S ②S=>(T) =>(T,S) =>(S,S) S ( T ) S a =>((T),S) =>((T,S),S) a T , S ( T ) =>((T,S,S),S) =>((S,S,S),S) S a T , S =>(((T),S,S),S) =>(((T,S),S,S),S) a T , S ( T ) =>(((S,S),S,S),S) =>(((a,S),S,S),S) ①S=>(T) =>(T,S) S ^ S =>(((a,a),S,S),S) =>(S,S) =>(a,S) =>(((a,a),^,S),S) =>(a,(T)) ( T ) a =>(((a,a),^,(T)),S) =>(a,(T,S)) =>(((a,a),^,(S)),S) =>(a,(S,S)) T , S =>(((a,a),^,(a)),S) =>(a,(a,S)) =>(((a,a),^,(a)),a) =>(a,(a,a)) S a a (2) 消除左递归 G': S→a | ∧| (T) T→ST' T'→,ST' |ε 递归子程序: program parser proceduce T; begin begin getsym; if sym in [a,^,() then S begin end; S;

实验二自顶向下语法分析--递归下降法

实验二递归下降法判断算术表达式的正确性 学时数:2-4 一、实验目的和要求 1、用递归下降技术实现语法分析器; 2、理解自顶向下语法分析方法; 3、熟练掌握预测分析程序的构造方法。 二、实验内容 算术表达式的文法是G[E]: E→E+T| T T→T*F| F F→(E)| i 用递归下降分析法按文法G[E]对算术表达式(包括+、*、()的算术表达式)进行语法分析,判断该表达式是否正确。 三、实验步骤 1、准备:阅读课本有关章节,将上述算术表达式的文法改造成LL(1)文法(即消除左递 归和提取左公因子);按P87例4.12编写程序。 2、上机调试,发现错误,分析错误,再修改完善。 四、测试要求 1、为降低难度,表达式中不含变量(只含单个无符号整数或i); 2、如果遇到错误的表达式,应输出错误提示信息(该信息越详细越好); 3、测试用的表达式建议事先放在文本文件中,一行存放一个表达式,以分号结束。而 语法分析程序的输出结果写在另一个文本文件中; 4、选作:对学有余力的同学,可增加功能:当判断一个表达式正确时,输出计算结果。 5、程序输入/输出示例: 如参考C语言的运算符。输入如下表达式(以分号为结束)和输出结果: (a)1; 或 i; 输出:正确 (b)1+2; 或 i+i; 输出:正确 (c)(1+2)*3+4-(5+6*7); 或 (i+i)*i+i-(i+i*i); 输出:正确 (d)((1+2)*3+4 或 ((i+i)*i+i; 输出:错误,缺少右括号 (e)1+2+3+(*4/5) 或 i+i+i+(*4/5); 输出:错误

五、实验报告要求 1、写出修改后LL(1)文法 2、通过对核心代码做注释或通过程序流程图的方式说明递归下降分析程序的实现思想。 3、写出调试程序出现的问题及解决的方法。 4、给出测试的结果。 六、思考(选作) 文法G[E]所构造算术表达式只包含+和*。请修改文法和程序,使得该语法程序可判断包含减号和除号的算术表达式的正确性。 [实验指导] 将文法G[E]改造为LL(1)文法如下: G’[E]: E → TE’ E’→ +TE’| ε T → FT’ T’→ *FT’|ε F → (E)| i [补充说明] 预测分析法分析程序可以从网上下载,但要求: (1)理解该程序,在实验报告中说明该程序所使用的文法及修改后的文法; (2)实验报告要求同上

实验三 自下而上语法分析报告及语义分析报告

实验三自下而上语法分析及语义分析一、实验目的: 通过本实验掌握LR分析器的构造过程,并根据语法制导翻译,掌握属性文法的自下而上计算的过程。 二、实验学时: 4学时。 三、实验容 根据给出的简单表达式的语法构成规则(见五),编制LR分析程序,要求能对用给定的语法规则书写的源程序进行语法分析和语义分析。 对于正确的表达式,给出表达式的值。 对于错误的表达式,给出出错位置。 四、实验方法 采用LR分析法。 首先给出S-属性文法的定义(为简便起见,每个文法符号只设置一个综合属性,即该文法符号所代表的表达式的值。属性文法的定义可参照书137页表6.1),并将其改造成用LR分析实现时的语义分析动作(可参照书145页表6.5)。 接下来给出LR分析表。 然后程序的具体实现: ●LR分析表可用二维数组(或其他)实现。 ●添加一个val栈作为语义分析实现的工具。 ●编写总控程序,实现语法分析和语义分析的过程。 注:对于整数的识别可以借助实验1。

五、文法定义 简单的表达式文法如下: E->E+T|E-T|T T->T*F|T/F|F F->(E)|i 上式中,i 为整数。 六、处理程序例 例1: 正确源程序例: 23+(45+4)* 40分析结果应为:正确的表达式。其值为:1983 例2: 错误源程序例: 5+(56+)-24 分析结果应为:错误的表达式:出错位置为)

附录:源程序 #include #include"string.h" #include using namespace std; #define R 30 #define C 20 typedef struct elem { char e[4]; }Elem; //ACTION表与GoTo表中的元素类型 Elem LR[R][C]; //存放ACTION表与GoTo表中的容 typedef struct out { int order; //序号 int state[10]; //状态栈 char sign[30]; //符号栈 char grasen[20]; //产生式

第四章 语法分析——自上而下分析

第四章语法分析——自上而下分析 【关键问题】 ◇什么叫确定的自上而下语法分析? ◇自上而下语法分析是从文法的开始符号出发,反复使用各种产生式,寻找与输入符号匹配的推导。 ◇在确定的自上而下语法分析过程中,当以同一个非终结符为左部的产生式有多个不同右部时,如何选择用哪个产生式的右部替换当前的非终结符? ◇确定的自上而下语法分析对文法有何限制? 【学习目标】 确定的自上而下分析方法虽对文法有一定的限制,但由于实现方法简单、直观,便于手工构造或自动生成语法分析器,因而仍是目前常用的方法之一。 ◇能够对一个给定的文法判断是否是LL(1)文法; ◇能构造预测分析表; ◇能用预测分析方法判断给定的输入符号串是否是该文法的句子; ◇能对某些非LL(1)文法做等价变换: ①消除左递归; ②提取左公共因子 【学习指南】 确定的自上而下分析由于实现方法简单、直观、便于手工构造,因此,仍是目前常用的语法分析方法之一,尤其对小型编译器的实现较为适合。确定的自上而下分析要求文法是LL(1)的,所以,能否用确定的自上而下分析方法构造语法分析器,首先必须对所给文法进行判断。由此构造LL(1) 分析器的关键问题是对文法的LL(1)判别。判断LL(1)文法时用到文法符号串的开始符号集合(FIRST集)和非终结符的后跟符号集合(FOLLOW集)的计算。本章的学习要求大家对给定的文法能熟练、准确地计算出产生式右部符号串的开始符号集合和每个非终结符的后跟符号集合,只有这两个集合的元素计算准确无误,才能对LL(1)文法的判断得出正确结论,从而正确构造LL(1)分析表。对非LL(1)文法的等价变换特别要注意的是:消除了左递归、提取了左公共因子后不一定就能满足LL(1)文法的条件。 【难重点】 语法分析是编译程序的核心部分。语法分析的作用是识别由词法分析给出的单词符号序列是否是给定文法的正确句子(程序),目前语法分析常用的方法有自上而下分析和自下而上分析两大类。本章将主要介绍确定的自上而下分析思想和对文法的要求。确定的自上而下分析要求文法满足LL(1)文法。本章主要介绍内容为: ◇LL(1) 文法的定义和判别 ◇非LL(1)文法的等价变换 ◇确定的自上而下分析方法 ◇预测分析方法 重点: ①LL(1)文法的定义和判别 ②非LL(1)文法的等价变换 ③预测分析方法 难点: 对一个文法如何判断是否是LL(1)文法。在判断LL(1)文法时用到文法符号串的开始符号集合(FIRST 集)和非终结符后跟符号集合(FOLLOW集)的计算,由于概念不清或不够细心常常导致对这两个集合的计算出错。 【知识结构】

编译原理语法分析程序设计(ll(1)分析法)

1.实验目的:掌握LL(1)分析法的基本原理,掌握LL(1)分析表的构造方法,掌握LL(1) 驱动程序的构造方法。 2.实验要求:实现LR分析法(P147,例)或预测分析法(P121,例)。 3.实验环境:一台配置为1G的XP操作系统的PC机;Visual C++. 4.实验原理:编译程序的语法分析器以单词符号作为输入,分析单词符号串是否形成符 合语法规则的语法单位,如表达式、赋值、循环等,最后看是否构成一个符合要求的程 序,按该语言使用的语法规则分析检查每条语句是否有正确的逻辑结构,程序是最终的一个 语法单位。编译程序的语法规则可用上下文无关文法来刻画。 语法分析的方法分为两种:自上而下分析法和自下而上分析法。自上而下就是从文法的 开始符号出发,向下推导,推出句子。而自下而上分析法采用的是移进归约法,基本思想是: 用一个寄存符号的先进后出栈,把输入符号一个一个地移进栈里,当栈顶形成某个产生式的 一个候选式时,即把栈顶的这一部分归约成该产生式的左邻符号。 自顶向下带递归语法分析:1、首先对所以的生成式消除左递归、提取公共左因子 2、在源程序里建立一个字符串数组,将所有的生成式都存在这个数组中。 3、给每个非终结符写一个带递归的匹配函数,其中起始符的函数写在main函数里。这 些函数对生成式右边从左向右扫描,若是终结符直接进行匹配,匹配失败,则调用出错函数。 如果是非终结符则调用相应的非终结符函数。 4、对输入的符号串进行扫描,从起始符的生成式开始。如果匹配成功某个非终结符生 成式右边的首个终结符,则将这个生成式输出。匹配过程中,应该出现的非终结符没有出现, 则出错处理。 5.软件设计与编程:对应源程序代码: #include <> #include <> #include using namespace std; struct Node1 { char vn; char vt; char s[10]; }MAP[20]; n==vn && MAP[i].vt==vt) {return MAP[i].s;} } return "error";} char * Analyse(char * word) { char p,action[10],output[10]; int i=1,j,l=strlen(word),k=0,l_act,m; while(!()) {();} ('#'); (start); printf("___________________________________________________________\n"); printf("\n 对符号串%s的分析过程\n",word); printf(" -----------------------------------------------------------------------\n

实验三自上而下语法分析--预测分析

实验三预测分析法判断算术表达式的正确性 学时数:6 一、实验目的 1、理解语法分析器的构造方法和工作原理; 2、理解自上而下语法分析方法; 3、熟练掌握预测分析程序的构造方法。 二、实验内容 算术表达式的文法是G[E]: E→E+T| T T→T*F| F F→(E)| id 用预测分析法按文法G[E]对算术表达式(包括+、*、()的算术表达式)进行语法分析,判断该表达式是否正确。 三、实验步骤 1、准备:阅读课本有关章节,将上述算术表达式的文法改造成LL(1)文法;设计出预测 分析表;按算法3.1(P56)编写程序。 2、上机调试,发现错误,分析错误,再修改完善。 四、测试要求 1、为降低难度,表达式中不含变量(只含单个无符号整数或i); 2、如果遇到错误的表达式,应输出错误提示信息(该信息越详细越好); 3、测试用的表达式建议事先放在文本文件中,一行存放一个表达式,同时以分号结束。 同时将语法分析程序的输出结果写在另一个文本文件中; 4、对学有余力的同学,可增加功能:当判断一个表达式正确时,输出计算结果。 5、程序输入/输出示例: 如参考C语言的运算符。输入如下表达式(以分号为结束)和输出结果: (a)1; 输出:正确 (b)1+2; 输出:正确 (c)(1+2)/3+4-(5+6/7); 输出:正确 (d)((1-2)/3+4 输出:错误,缺少右括号 (e)1+2-3+(*4/5) 输出:错误

五、实验报告要求 1、写出修改后LL(1)文法,所构造的预测分析表。 2、通过对核心代码做注释或通过程序流程图的方式说明预测分析程序的实现思想。 3、写出调试程序出现的问题及解决的方法。 4、给出测试的结果。 六、思考(选作) 文法G[E]所构造算术表达式只包含+和*。请修改文法和程序,使得该语法程序可判断包含减号和除号的算术表达式的正确性。 [实验指导] 将文法G[E]改造为LL(1)文法如下: G’[E]: E → TE’ E’→ +TE’| ε T → FT’ T’→ *FT’|ε F → (E)| i [补充说明] 预测分析法分析程序可以从网上下载,但要求: (1)理解该程序,在实验报告中说明该程序所使用的文法和预测分析表; (2)实验报告要求同上

自上而下语法分析实验报告

实验二:自上而下语法分析 一、实验目的和要求 根据某一文法编制调试递归下降分析程序,以便对任意输入的符号串进行分析。根据某一文法编制调试LL(1)分析程序,以便对任意输入的符号串进行分析。本次实验的目的主要是加深对自上而下分析法的理解,从而实现一个LL(1)文法分析器。 二、实验容 (1)功能描述: LL(1)分析法的功能是利用LL(1)控制程序根据显示栈栈顶容、向前看符号以LL(1)预测分析表,对输入符号串自上而下的分析过程。 本程序是基于已构建好的某一个语法的预测分析表来对用户的输入字符串进行分析,判断输入的字符串是否属于该文法的句子。 (2)程序基本实现思想: 接收用户输入的字符串(字符串以“#”表示结束)后,对用做分析栈的一维数组和存放分析表的二维数组进行初始化。然后取出分析栈的栈顶字符,判断是否为终结符,若为终结符则判断是否为“#”且与当前输入符号一样,若是则语法分析结束,输入的字符串为文法的一个句子,否则出错若不为“#”且与当前输入符号一样则将栈顶符号出栈,当前输入符号从输入字符串中除去,进入下一个字符的分析。若不为“#”且不与当前输入符号一样,则出错。 若栈顶符号为非终结符时,查看预测分析表,看栈顶符号和当前输入符号是否构成产生式,若产生式的右部为ε,则将栈顶符号出栈,取出栈顶符号进入下一个字符的分析。若不为ε,将产生式的右部逆序的入栈,取出栈顶符号进入下一步分析。 (3)程序要求: 程序输入/输出示例: 对下列文法,用LL(1)分析法对任意输入的符号串进行分析: E→TE’ E’→+TE’|ε T→FT’ T’→*FT’|ε F→i|(E)

该文法的预测分析表为: 输出的格式如下: LL(1)分析:输入一以#结束的符号串(包括+—*/()i#):在此位置输入符号串例如:i+i*i# 输出结果:显示步骤、分析栈、剩余输入串和所用产生式的分析推导过程,若出错,则显示出在哪一步出错,并显示i+i*i#为不合法符号串。 (4)程序流程图:

自上而下的语法分析

第4章自上而下的语法分析 从文法的开始符号出发进行推导,最终推出确定的输入串(由单词种别构成的源程序)。 4.1 带回溯的自上而下分析法概述 从根结点出发,试图用一切可能的办法,自上而下地为输入串建立一棵语法树。或者说,为输入串寻找一个最左推导。 ㈠分析过程概述 例已知文法G: S→xAy A→**|* 和输入串α=x*y。 ①初始时,指示器P指向α的第一个符号x。 S x * y ②从S推导,因最左子结和输入串第一个符号相匹配,故指示器P指向下一符号*。 S x * y x A y ③因第二个子结是非终结符A,从A采用第一个候选进行推导。从A推导出的左子结和指示器P所指的符号一致,故P指向下一个符号y。 S x *y x A y ** ④因A的第二个子结*和指示器P所指的符号不一致,这意味着A的第一个候选不适用于构造α的语法树,应该回溯。将A的子树注销,P恢复进入A时的值。 S x * y x A y ⑤用A的第二个候选进行推导,因子树A的子结和指示器P所指的符号*一致,则P 指向下一个符号y。 S x * y x A y * ⑥因S的第三个子结和指示器P所指的符号一致,故α是一个句子。 显然上述分析过程本质上是一个试探过程,是反复使用不同产生式谋求匹配输入串的过程。

㈡问题和困难 ①对于左递归文法定义的语言,不能采用自上而下的语法分析法。 例已知左递归文法G:S→Sb∣a和输入串α=ab,其分析过程如下所示: S ab S b .... b 试图用非终结去推导匹配输入串,而推导所得到的子树第一个子结是该非终结符本身,这样就陷入了死循环。 ②存在虚假匹配,回溯不可避免。 ③编译程序的语法分析和语义分析通常是同时进行的。由于回溯,编译程序所做的一大堆语义分析工作必须推倒重来。 ④当选用所有的不同候选组合,都不能为输入串建立一棵语法树,那么输入串存在语法错误。这种分析法最终只能告知输入串不是文法的一个句子,而无法告知输入串错在何处。 ⑤带回溯的自上而下分析法实际上是一种穷尽一切可能的试探法,因此效率很低,这种分析法几乎没有实用价值。 4.2 直接左递归的消除 ㈠实例引入 例:已知左递归文法G:S→Sa|b,构造文法G的等价文法G',G'不含左递归。 解:文法G'如下所示 S→bS' S'→aS'|ε ∵S Sa Saa … ba n 或S b ∴L(G)={ ba n∣n≥0} ∵S bS' baS' … ba n 或S b S' b ∴L(G')={ ba n∣n≥0} ∵L(G)= L(G') ∴文法G和G'等价,而文法G'不含左递归。 ㈡直接左递归消除方法 假定关于非终结符P的规则为 P→Pα|β 其中,β不以P开头。可以把关于P的规则变换为如下形式: P→βP' P'→αP'|ε 由于二者推导出的句型均为βαn(n≥0),故上述变换是等价的。 例文法G E→E+T|T T→T*F|F F→(E)|i|x|y 经消除直接左递归后变成

编译原理小题答案

《编译原理》常见题型 一、填空题 1.编译程序的工作过程一般可以划分为词法分析,语法分析,中间代码生成,代码优化(可省) ,目标代码生成等几个基本阶段。 2.若源程序是用高级语言编写的,目标程序是机器语言程序或汇编程序,则其翻译程序称为编译程序. 3.编译方式与解释方式的根本区别在于是否生成目标代码. 5.对编译程序而言,输入数据是源程序,输出结果是目标程序. 7.若源程序是用高级语言编写的,目标程序是机器语言程序或汇编程序,则其翻译程序称为编译程序。 8.一个典型的编译程序中,不仅包括词法分析、语法分析、中间代码生成、代码优化、目标代码生成等五个部分,还应包括表格处理和出错处理。其中,词法分析器用于识别单词。 10.一个上下文无关文法所含四个组成部分是一组终结符号、一组非终结符号、一个开始符号、一组产生式。 12.产生式是用于定义语法成分的一种书写规则。 13.设G[S]是给定文法,则由文法G所定义的语言L(G)可描述为:L(G)={x│S=>*x,x∈VT*} 。 14.设G是一个给定的文法,S是文法的开始符号,如果S * ?x(其中x∈V*),则称x是 文法的一个句型。 15.设G是一个给定的文法,S是文法的开始符号,如果S * ?x(其中x∈V T*),则称x是文 法的一个句子。 16.扫描器的任务是从源程序中识别出一个个单词符号。 17.语法分析最常用的两类方法是自上而下和自下而上分析法。 18.语法分析的任务是识别给定的终结符串是否为给定文法的句子。 19.递归下降法不允许任一非终结符是直接左递归的。 20.自顶向下的语法分析方法的关键是如何选择候选式的问题。 21.递归下降分析法是自顶向下分析方法。 22.自顶向下的语法分析方法的基本思想是:从文法的开始符号开始,根据给定的输入串并按照文法的产生式一步一步的向下进行直接推导,试图推导出文法的句子,使之与给定的输入串匹配。 23.自底向上的语法分析方法的基本思想是:从给定的终结符串开始,根据文法的规则一步一步的向上进行直接归约,试图归约到文法的开始符号。 24.自底向上的语法分析方法的基本思想是:从输入串入手,利用文法的产生式一步一步地 向上进行直接归约,力求归约到文法的开始符号。 26.在LR(0)分析法的名称中,L的含义是自左向右的扫描输入串,R的含义是最 左归约,0 的含义是向貌似句柄的符号串后查看0个输入符号。 31.终结符只有综合属性,它们由词法分析器提供。

相关文档
最新文档