📜  上下文无关语法的分类(1)

📅  最后修改于: 2023-12-03 15:35:53.309000             🧑  作者: Mango

上下文无关语法的分类

介绍

在计算机领域中,上下文无关语法是一种形式文法(也称文法范式)的子类,通常用于编程语言的设计和解析。上下文无关语法中的规则都是独立且不受先前的符号、字符串或上下文的影响。

常见的上下文无关语法
LL(1) 文法

LL(1) 文法指的是左侧扫描、左侧推导(Left-to-Right, Leftmost derivation)、仅仅查看后一个输入字符(Follow)就能够决定应用哪一条产生式的上下文无关文法。LL(1) 文法可以使用递归下降解析器进行解析,并且它是上下文无关文法的一种特殊形式。

<Expr> ::= <Term> <ExprTail>
<ExprTail> ::= + <Term> <ExprTail> | ε
<Term> ::= <Factor> <TermTail>
<TermTail> ::= * <Factor> <TermTail> | ε
<Factor> ::= ( <Expr> ) | id

以上是一个 LL(1) 文法的例子,用于表达简单的算术表达式。它包含三个非终结符号和一个起始符号。每一个非终结符号都有一些可以被应用的产生式。

LR(1) 文法

LR(1) 文法指的是左侧扫描、右侧推导(Right-to-Left, Rightmost derivation),同时也可以查看后一个输入字符的上下文无关文法。LR(1) 文法通常会使用自下而上的文法分析器进行解析。

S → L = R | R
L → * R | id
R → L

以上是一个 LR(1) 文法的例子,用于表达赋值语句。它包含了三个非终结符和一个起始符号。它的关键是 L 和 R 之间的循环依赖,导致需要向前一个 token 确定应用哪一个产生式。

LALR(1) 文法

LALR(1) 文法指的是没用“看前一个字符”的 LR(1) 文法,这里的 LA 指的是 Look Ahead(前缀)。LALR(1) 文法可以被编译器使用,并且拥有更快的分析速度和较小的内存占用量。

E → E + T
E → T
T → T * F
T → F
F → ( E )
F → id

以上是一个 LALR(1) 文法的例子,用于表达算术表达式。它包含了三个非终结符和一个起始符号。

总结

上下文无关语法是一种重要的形式文法的子类,通常适用于编程语言的设计和解析。LL(1) 文法等令人熟知的子类均应用广泛,并且在编译器设计和实现的许多方面都发挥着关键作用。