上下文无关的文法生成器

合集下载

编译原理词法分析与语法分析的核心算法

编译原理词法分析与语法分析的核心算法

编译原理词法分析与语法分析的核心算法编译原理是计算机科学与技术领域中的一门重要课程。

在编程中,我们常常需要将高级语言编写的程序翻译成机器语言,使计算机能够理解并执行我们编写的程序。

而编译原理中的词法分析和语法分析是编译器的两个核心算法。

一、词法分析词法分析是编译器的第一个阶段,它负责将输入的字符序列(源代码)划分为一个个的有意义的词素(Token),并生成相应的词法单元(Lexeme)。

词法分析的核心算法主要包括以下两个步骤:1. 正则表达式到有限自动机的转换:正则表达式是一种描述字符串匹配模式的表达式,它可以用来描述词法分析中各种词素的规则。

而有限自动机则是一种用来识别或匹配正则表达式所描述的模式的计算模型。

将正则表达式转换为有限自动机是词法分析的关键步骤之一。

2. 词法分析器的生成:在将正则表达式转换为有限自动机后,我们可以使用生成器工具(如Lex、Flex等)来生成词法分析器。

词法分析器可以按照预定的规则扫描源代码,并将识别出的词素转换成相应的词法单元,供后续的语法分析使用。

二、语法分析语法分析是编译器的第二个阶段,它负责分析和处理词法分析阶段生成的词法单元序列,并根据预定的语法规则确定语法正确的序列。

语法分析的核心算法主要包括以下两个步骤:1. 上下文无关文法的定义:上下文无关文法(Context-Free Grammar,简称CFG)是一种用于描述形式语言的文法。

它由一组产生式和终结符号组成,可以用于描述语法分析中的语法规则。

在语法分析中,我们需要根据具体编程语言的语法规则,编写相应的上下文无关文法。

2. 语法分析器的生成:通过使用生成器工具(如Yacc、Bison等),我们可以根据上下文无关文法生成语法分析器。

语法分析器可以根据预先定义的文法规则,对词法单元序列进行分析,并构建出语法树(Parse Tree)供后续的语义分析和代码生成使用。

综上所述,词法分析与语法分析是编译原理中的两个重要阶段,也是实现编译器的核心算法。

pda编译原理

pda编译原理

pda编译原理
2. 语法分析:语法分析是将词法单元序列转化为语法结构的过程。在PDA编译原理中, 可以使用上下文无关文法(Context-Free Grammar)和PDA来实现语法分析器,将词法单 元序列转化为语法树或语法分析树。
3. 语义分析:语义分析是对语法结构进行语义检查和语义动作的过程。在PDA编译原理 中,可以使用符号表(Symbol Table)和PDA来实现语义分析器,对语法结构进行类型检查 、计算表达式的值等语义操作。
a编译原理
4. 中间代码生成:中间代码生成是将语法树或语法分析树转化为中间代码的过程。在 PDA编译原理中,可以使用PDA和转换规则来实现中间代码生成器,将语法结构转化为中间 代码表示形式,如三地址码、四元式等。
5. 代码优化:代码优化是对中间代码进行优化的过程,以提高程序的性能和效率。在 PDA编译原理中,可以使用PDA和优化规则来实现代码优化器,对中间代码进行常量折叠、 循环优化、公共子表达式提取等优化操作。
pda编译原理
PDA(Pushdown Automaton)是一种计算模型,它是有限状态自动机(Finite State Automaton)的扩展,具有一个栈(stack)作为额外的存储器。PDA编译原理是指将编译 原理的概念和技术应用于PDA的设计和实现。
PDA编译原理主要涉及以下几个方面:
1. 词法分析:词法分析是将输入的字符序列划分为词法单元(tokens)的过程。在PDA 编译原理中,可以使用正则表达式或有限状态自动机来实现词法分析器,将输入的字符序列 转化为词法单元序列。
pda编译原理
6. 目标代码生成:目标代码生成是将中间代码转化为目标机器代码的过程。在PDA编译 原理中,可以使用PDA和目标机器的指令集来实现目标代码生成器,将中间代码转化为目标 机器代码。

antlr4 原理

antlr4 原理

antlr4 原理ANTLR4原理ANTLR(全称为ANother Tool for Language Recognition)是一种强大的语言识别工具,它基于LL(*)文法分析算法。

ANTLR4是ANTLR的第四个版本,它在前几个版本的基础上进行了重大改进和优化。

本文将介绍ANTLR4的原理和工作方式。

1. ANTLR4的基本原理ANTLR4使用上下文无关文法(Context-Free Grammar,简称CFG)来描述语言的语法规则。

CFG由一组产生式(Production)组成,每个产生式由一个非终结符(Nonterminal)和一个或多个终结符(Terminal)组成。

ANTLR4通过解析输入的文本,根据CFG的规则生成语法树(Parse Tree)。

2. ANTLR4的工作流程ANTLR4的工作流程可以分为三个主要步骤:词法分析、语法分析和语义分析。

2.1 词法分析词法分析器(Lexer)将输入的文本分割成一个个的词法单元(Token)。

词法单元是语言中的最小语法单位,例如关键字、标识符、运算符等。

ANTLR4使用正则表达式来定义词法规则,识别并生成相应的词法单元。

2.2 语法分析语法分析器(Parser)根据语法规则对词法单元进行组合,生成语法树。

ANTLR4使用LL(*)文法分析算法,该算法通过预测下一个可能的词法单元来进行分析。

语法分析器根据产生式规则递归地构建语法树,直到解析完成或发生错误。

2.3 语义分析语义分析器(Semantic Analyzer)对语法树进行语义检查和语义动作。

语义检查包括类型检查、作用域检查等,确保程序的语义正确。

语义动作是在语法规则中定义的,用于执行特定的语义操作,例如计算表达式的值、生成中间代码等。

3. ANTLR4的特点ANTLR4具有以下几个特点:3.1 高度可定制ANTLR4提供了丰富的选项和配置,可以根据需要定制词法分析器和语法分析器的行为。

bison 规则

bison 规则

bison 规则Bison规则是一种用于生成语法分析器的工具。

它是GNU工具链中的一部分,被广泛应用于编程语言的编译器开发过程中。

本文将对Bison规则进行详细的介绍和解释。

Bison是一种基于LALR(1)的语法分析器生成器。

它接受一个上下文无关文法作为输入,并生成一个解析器,用于解析满足该文法的输入。

Bison规则定义了文法的产生式和语义动作,用于生成解析器的代码。

Bison规则由两部分组成:产生式和语义动作。

产生式定义了文法中的语法规则,描述了如何将非终结符转换为终结符或其他非终结符。

语义动作则定义了在解析过程中应该执行的代码。

它可以是任何合法的C/C++代码,用于对输入进行处理。

一个简单的Bison规则示例如下:```expr: expr '+' expr { printf("Addition\n"); }| expr '-' expr { printf("Subtraction\n"); }| expr '*' expr { printf("Multiplication\n"); }| expr '/' expr { printf("Division\n"); }| '(' expr ')' { printf("Parentheses\n"); }| number { printf("Number\n"); };```在这个示例中,我们定义了一个简单的表达式文法,用于解析四则运算表达式。

通过Bison规则,我们可以定义加法、减法、乘法、除法和括号操作。

每个产生式后面的语义动作会在解析过程中执行,用于打印相应的操作类型。

Bison规则的执行过程如下:首先,Bison将输入的文法转换为一个LR(0)文法,并构建LR(0)自动机。

上下文无关文法的概念

上下文无关文法的概念

上下文无关文法的概念上下文无关文法的概念一、引言上下文无关文法(Context-Free Grammar,CFG)是形式语言理论中的一种重要的语法描述工具,它是由 Noam Chomsky 在 1956 年提出的。

CFG 是一种用于产生形式语言的形式化体系,它可以描述自然语言、编程语言等各种形式语言。

二、基本概念1. 文法(Grammar)文法是一个四元组 G = (V, T, P, S)。

其中 V 是非终结符集合,T 是终结符集合,P 是产生式规则集合,S 是起始符号。

非终结符表示语法规则中可以被替换的部分,终结符表示不能被替换的部分。

2. 产生式规则(Production Rule)产生式规则也称为产生式或规则,它是一个形如A → α 的表达式。

其中A 是一个非终结符号,α 是由非终结符号和终结符号组成的字符串。

3. 推导(Derivation)推导也称为生成或演算,它是指根据 CFG 的产生式规则从起始符号开始逐步推导出一个字符串的过程。

4. 句子(Sentence)句子也称为字符串或序列,它是由 CFG 的终结符号构成的序列。

三、上下文无关文法的特征CFG 的产生式规则中,只有一个非终结符号可以被替换成一个字符串,而且这个非终结符号出现在产生式规则左侧。

四、上下文无关文法的形式定义一个 CFG G = (V, T, P, S) 是上下文无关的,当且仅当它的产生式规则集合 P 中的每个规则都是形如A → α 的形式,其中A ∈ V,α ∈ (V ∪ T)*。

五、上下文无关文法的应用CFG 可以描述自然语言、编程语言等各种形式语言。

在编译器设计和自然语言处理中,CFG 是一种常用的工具。

六、总结上下文无关文法是一种用于产生形式语言的形式化体系。

它可以描述自然语言、编程语言等各种形式语言。

CFG 的特征是产生式规则中只有一个非终结符号可以被替换成一个字符串,并且这个非终结符号出现在产生式规则左侧。

bison 语法

bison 语法

bison 语法Bison语法是指使用GNU Bison工具创建语法分析器时所用的语法。

Bison是一个生成器,它将给定的上下文无关文法转换成一个LALR(1)解析器。

在本文中,我们将讨论Bison语法的各个方面,包括规则、终结符、非终结符、动作和优先级。

规则Bison规则定义了上下文无关文法的产生式。

每个规则由一个非终结符和一组符号组成,这些符号可以是终结符或非终结符。

每个规则以分号结束。

以下是一个简单的例子:```expr: expr '+' expr| expr '-' expr| term;term: term '*' factor| term '/' factor| factor;factor: '(' expr ')'| NUM;```在这个例子中,我们定义了三个非终结符:expr、term和factor。

每个非终结符都有一组规则来定义它们的产生式。

终结符在Bison中,终结符表示输入中不可再分的最小单元。

例如,在一个算术表达式中,加号、减号、乘号和除号都是终结符。

在上面的例子中,我们使用了NUM作为一个表示数字的终结符。

非终结符非终结符表示可以由其他标记(包括其他非终结符和终结符)组成的标记。

在上面的例子中,我们定义了三个非终结符:expr、term和factor。

动作Bison规则中的动作是在解析器读取输入时执行的代码片段。

动作可以是任何有效的C代码,它们通常用于计算语法树中节点的值或执行其他操作。

以下是一个简单的例子:```expr: expr '+' expr{ $$ = $1 + $3; }| expr '-' expr{ $$ = $1 - $3; }| term{ $$ = $1; };```在这个例子中,我们使用$1、$2和$3来引用规则中不同部分的值。

上下文无关文法的定义

上下文无关文法的定义

上下文无关文法的定义上下文无关文法(Context-Free Grammar,简称CFG)是一种用于描述形式语言的形式体系。

它定义了一个形式语言中所有可能的合法句子的结构和规则。

CFG 是由生成规则和终结符集合组成的,能够产生符合特定语法规则的句子。

CFG 在计算机科学和语言学领域都有广泛的应用,特别是在编译器设计、自然语言处理和形式语言理论等方面。

CFG 的组成部分CFG 包含了以下几个组成部分:1.终结符:形式语言中可以出现在最终生成的句子中的符号。

它们是语言的基本元素,不能再分解。

例如,对于一个用于描述算术表达式的文法,终结符可以是数字、运算符和括号等。

2.非终结符:形式语言中的符号,可以表示一组可能的字符串或句子,可以通过生成规则进一步扩展成另一个非终结符或者终结符。

非终结符通常用大写字母表示。

3.生成规则:用于生成符合语言规范的字符串或句子的规则。

生成规则由一个非终结符和一个或多个字符串组成。

生成规则示例:“S -> A B”,表示非终结符 S 可以由非终结符 A 和 B 按照一定规则生成。

4.开始符号:非终结符中的一个,表示生成句子开始的符号。

5.推导:使用生成规则,从开始符号逐步推导出符合语法规则的句子的过程。

推导可以通过一系列步骤实现,每一步都应用一个生成规则。

6.语法树:表示通过推导生成的句子的树形结构。

每个非终结符在语法树中对应一个节点,终结符对应叶子节点,生成规则对应节点之间的连接。

CFG 的示例为了更好地理解 CFG,下面以一个简单的算术表达式文法为例进行说明:1. E -> E + E // 生成规则12. E -> E - E // 生成规则23. E -> num // 生成规则3其中,E 是非终结符,表示表达式;+ 和 - 是终结符,表示加法和减法运算符;num 是终结符,表示数字。

这个文法可以生成类似于“2 + 3 - 1” 的算术表达式。

上下文无关文法与上下文有关文法

上下文无关文法与上下文有关文法

上下文无关文法形式语言理论中一种重要的变换文法,用来描述上下文无关语言,在乔姆斯基分层中称为2型文法。

由于程序设计语言的语法基本上都是上下文无关文法,因此应用十分广泛。

简介上下文无关文法(Context-Free Grammar, CFG)在计算机科学中,G = (N, Σ, P, S) 的产生式规则都取如下的形式:V -> w,则称之为上下文无关的,其中V∈N ,w∈(N∪Σ)* 。

上下文无关文法取名为“上下文无关”的原因就是因为字符V 总可以被字串w 自由替换,而无需考虑字符V 出现的上下文。

一个形式语言是上下文无关的,如果它是由上下文无关文法生成的﹙条目上下文无关语言﹚。

来定义的。

另一方面,上下文无关文法又足够简单,使得我们可以构造有效的分析算法来检验一个给定字串是否是由某个上下文无关文法产生的。

例子可以参见LR 分析器和LL 分析器。

BNF ﹙巴克斯-诺尔范式﹚经常用来表达上下文无关文法。

文法规则使用相似的表示法。

名字用斜体表示(但它是一种不同的字体,所以可与正则表达式相区分)。

竖线仍表示作为选择的元符号。

并置也用作一种标准运算。

但是这里没有重复的元符号(如正则表达式中的星号*),稍后还会再讲到它。

表示法中的另一个差别是现在用箭头符号“→”代替了等号来表示名字的定义。

这是由于现在的名字不能简单地由其定义取代,而需要更为复杂的定义过程来表示,这是由定义的递归本质决定的。

文法规则是定义在一个字母表或符号集之上。

在正则表达式中,这些符号通常就是字符,而在文法规则中,符号通常是表示字符串的记号。

我们利用C中的枚举类型定义了在扫描程序中的记号;为了避免涉及到特定实现语言(例如C记号。

此时的记号就是一个固定的符号,如同在保留字while 中或诸如+或: =这样的特殊符号一样,对于作为表示多于一个串的标识符和数的记号来说,代码字体为斜体,这就同假设这个记号是正则表达式的名字(这是它经常的表示)一样。

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

1 引言几乎所有程序设计语言都是通过上下文无关文法来定义的。

一个原因在于它们拥有足够强的表达力来表示大多数程序设计语言的语法,而且从另外一方面,上下文无关文法又足够简单,使得我们可以构造有效的分析算法来检验一个给定字符串是否是由某个上下文无关文法产生的。

具体的例子可以参见LR分析器和LL分析器.2 定义上下文无关文法(英语:context-free grammar,缩写为CFG),在计算机科学中,若一个形式文法G = (V, Σ, P, S) 的产生式规则都取如下的形式:A -> α,则谓之。

其中A∈V ,α∈(V∪Σ)*。

上下文无关文法取名为“上下文无关”的原因就是因为字符 A 总可以被字符串α自由替换,而无需考虑字符 A 出现的上下文。

一个形式语言是上下文无关的,如果它是由上下文无关文法生成的.正则语言和正则表达式,一个正则表达式可以用来表示一个句子集合(正则语言),且每个正则表达式都可以构造出有限状态自动机来判断任意的句子是否属于这个句子集合。

因此,用正则表达式来表示正则语言是精确的、可操作的。

那么,可以用正则表达式来表示程序语言(比如 C 语言)所代表的句子集合吗?很遗憾,答案是否定的。

正则表达式毕竟太简单了,无法来表示程序语言这样复杂级别的句子集合。

为了表示程序语言的句子集合,需要采用表达能力更强大的工具——上下文无关语法(context-free grammar)。

下面以一个简单的例子来说明什么是上下文无关语法,假设有一种非常非常原始的语言,我们把它成为 X 语言,它的句子只有:主语谓语宾语这样一种结构,主语中只有我、你、他三个词,谓语中只有吃一个词.宾语中只有饭、菜两个词。

我们把它的语法写出下面这样的形式:语句 -> 主语谓语宾语主语 -> 我主语 -> 你主语 -> 他谓语 -> 吃宾语 -> 饭宾语 -> 菜可以看出, X 语言总共只有 6 个句子: { 我吃饭, 我吃菜, ..., 他吃菜 }。

也就是说,我们可以用上面这个语法来表示 X 语言这个集合,我们可以从第一行的“语句 -> 主语谓语宾语” 开始,分别将主、谓、宾替换成可用的词,从而将所有满足语法的句子都推导出来。

对于任意一个句子,我们也可以将句子和此语法来对比,判断它是否属于满足 X 语言。

上面这个语法中的每一行形如“语句 -> 主语谓语宾语” 的式子称为产生式(production)。

产生式左侧的符号(语句、主语、谓语和宾语)称为非终结符(nonterminal),代表可以继续扩展或产生的符号,也就是说,当在某条产生式的右边遇到了此非终结符的时候,总是可以用本产生式的右边来替换这个非终结符。

而“我、你、他、吃、饭、菜” 这些符号是 X 语言中的词,无法再产生新的符号了,称为终结符(terminal)。

终结符只能出现在产生式的右边,非终结符则左边和右边都可以出现。

上述产生式中有一个特别的非终结符:“语句” , X 语言中的所有句子都以它为起点产生,这个符号被称为起始符号(start symbol)。

通常把同一个非终结符的产生式写在一起,用“|”隔开,如下:语句 -> 主语谓语宾语主语 -> 我 | 你 | 他谓语 -> 吃宾语 -> 饭 | 菜注意,上面的第二行中有 3 个产生式,第四行中有 2 个产生式。

一个上下文无关语法 G 就是由一个终结符集合 T ,一个非终结符集合 N ( N 和 T 不相交),一个产生式集合 P ,以及一个起始符号 S (S ∈ N)组成。

由语法 G 推导(产生)出来的所有的句子的集合称为 G 语言。

因此一个语法可以代表一个句子集合,也就是一个语言。

终结符和非终结符统称为符号,符号一般用字母 A, B, X, Y, a, b 表示,符号串一般用小写字母 u, v 表示。

产生式的形式为 A -> u ,其中 A 为非终结符, u 为一个符号串。

下面再来看一个例子:S –> ABA –> aA | εB –> b | bB这里面的第二行中的ε表示一个空句子,表示 A 可以用一个空句子来代替。

经过观察可知,这个语法所能推导出的所有句子的集合为:A : { ε, a, aa, aaa, ... }B : { b, bb, bbb, ... }S : { b, bb, bbb, ..., ab, abb, ..., aab, aabb, ... }因此 S 相当于正则表达式a*b+。

再来看一个稍微复杂的例子:Expr -> Expr op Expr | (Expr) | numberop -> + - * /其中的 number 是词法分析得到的一个 token ,它在词法分析中用正则表达式[0-9]+表示。

经过观察可知,此语法可以推导出所有的整数算术表达式:Expr : { 123, 25 + 24, 78 - 34, 12 * ( 23 + 9 ), ... }可以看出,上下文无关文法可以采用递归的形式推导,比正则表达式的表达能力要强大的多。

下面给出上下文本无关语法及相关术语的正式定义:终结符集合 T(terminal set):一个有限集合,其元素称为终结符(terminal)。

非终结符集合 N(non-terminal set):一个有限集合,与 T 无公共元素,其元素称为非终结符(non-terminal)。

符号集合 V(alphabet):T 和 N 的并集,其元素称为符号(symbol)。

因此终结符和非终结符都是符号。

符号可用字母:A, B, C, X, Y, Z, a, b, c 等表示。

符号串(a string of symbols):一串符号,如 X1 X2 ... Xn 。

只有终结符的符号串称为句子(sentence)。

空串(不含任何符号)也是一个符号串,用ε表示。

符号串一般用小写字母 u, v, w 表示。

产生式(production):一个描述符号串如何转换的规则。

对于上下文本无关语法,其固定形式为: A -> u ,其中 A 为非终结符, u 为一个符号串。

产生式集合 P (production set):一个由有限个产生式组成的集合。

展开(expand):一个动作:将一个产生式 A -> u 应用到一个含有 A 的符号串vAw 上,用 u 代替该符号串中的 A ,得到一个新的符号串 vuw 。

折叠(reduce):一个动作:将一个产生式 A -> u 应用到一个含有 u 的符号串vuw 上,用 A 代替该符号串中的 u ,得到一个新的符号串 vAw 。

起始符号 S (start symbol): N 中的一个特定的元素。

推导(derivate):一个过程:从一个符号串 u 开始,应用一系列的产生式,展开到另一个的符号串 v。

若 v 可以由 u 推导得到,则可写成: u => v 。

上下文本无关语法 G (context-free grammar, CFG):一个 4 元组: (T, N, P, S) ,其中 T 为终结符集合, N 为非终结符集合, P 为产生式集合, S 为起始符号。

一个句子如果能从语法 G 的 S 推导得到,可以直接称此句子由语法 G 推导得到,也可称此句子符合这个语法,或者说此句子属于 G 语言。

G 语言( G language)就是语法 G 推导出来的所有句子的集合,有时也用 G 代表这个集合。

解析(parse):也称为分析,是一个过程:给定一个句子 s 和语法 G ,判断 s 是否属于 G ,如果是,则找出从起始符号推导得到 s 的全过程。

推导过程中的任何符号串(包括起始符号和最终的句子)都称为中间句子(working string)。

为什么要把这种语法称为上下文本无关语法呢?这是由其产生式的固定形式 A -> u 所决定的,事实上,还有所谓的上下文有关语法,其产生式的形式为 v A w -> v u w ,也就是说只有 A 的上下文分别为 v 和 w 时,才能应用该产生式。

上下文本无关语法其实是上下文有关语法中的一种特例,也就是 v 和 w 分别为空串时的特例。

语法分析不但要判断给定的句子是否符合语法结构,而且还要分析出该句子符合哪些结构,也就是说,要分析出这个句子是怎么从起始符号开始产生出来的,并根据产生过程生成语法树。

如,对于“我吃饭” 这句话,只有我们知道了主语、谓语和宾语分别对应的是那个词,我们才能真正理解这句话的含义。

给定一个句子 12 + 53 ,经过观察,发现此句子可以按以下方式被推导出来:Expr ==> Expr + Expr ==> number + Expr ==> number + number ==> 12 + 53以上推导过程可以用分析树来表示:再看一个稍微长的句子: 12 + ( 53 - 7 ) ,其分析树如下:可以去掉此分析树中一些多余的节点,并进一步浓缩,得到抽象语法树:对于这种树状结构,可以采用递归的方式加以分析,从而生成目标代码。

再看一个句子: 12 + 53 * 7 ,这时候问题来了,我们发现它可以由两种不同的方式推导出来:这就是语法的歧义性,所谓歧义(ambiguity),就是指对于一个符合语法结构的句子,它可以由两种不同的方式被推导出来。

如果一个语法中,任何一个句子的推导方式都是唯一的,那这个语法就被称为是没有歧义的。

显然,程序语言必须是没有歧义的,对于上面的表达式,我们肯定希望它只能按后一种方式被推导。

语言和文法的开发需要借鉴和使用软件工程中的方法、工具和过程.在软件开发的历史中长期被忽视的测试、度量等活动应该在文法工程中得到重视和研究.文法测试的充分性准则用于判断文法是否得到了“足够”的测试.充分性准则越强, 测试越充分, 越能提高被测文法相对于目标语言(或目标文法) 的正确性和完整性, 测试开销通常也越大.消除歧义的方法之一是改写语法,将有歧义的产生式改写成无歧义的,这种改写非常困难,而且改写后的产生式往往和原产生式相差很大,可读性非常差。

另一种方法就是引入优先级,不需要改写语法,当推导过程中出现歧义的时候(也就是出现两种不同的推导方式的时候),利用符号的优先级来选择需要的推导方式3 分类从上一节可以看出,对于一个给定的语法 G ,从中推导出一个任意的句子是比较简单和直接的,但需要推导出指定的句子(或者说给定一个句子、要分析出它是怎么从起始符号开始推导得到的)就没那么简单了,这就是语法分析的任务。

分析可以采用自顶向下分析或自底向上分析两种方法,以下先简单介绍这两种方法的思路.自顶向下分析就是从起始符号开始,不断的挑选出合适的产生式,将中间句子中的非终结符的展开,最终展开到给定的句子。

相关文档
最新文档