【计算理论】上下文无关语法 ( 语法组成 | 规则 | 语法 | 语法示例 | 约定的简写形式 | 语法分析树 )





I . 语法组成



上下文无关语法 组成 : {V,Σ,R,S}\{ \quad V , \Sigma , R , S \quad \} 四部分组成 ;


变量集 VV : 有限的变量集合 ;

终端字符集 Σ\Sigma : 有限的终端字符组成的集合 ; 相当于常量的含义 , 与变量相对 ;

规则集 RR : 有限的规则组成的集合 , 规则规定如何进行代换操作 , 规定 变量 , 终端字符 , 字符串变量 等 ;

开始变量 SS : 该变量作为开始变量 ;





II . 规则



规则 简介 :


① 已知条件 : 假设 u,v,wu, v , w变量 ( 变元 )终端字符集 ( 常量 / 常元 ) ;

② 规则描述 : 规则是一个箭头 , AwA \to w , AA 是变元 , ww 是 变元 和 常元 组成的终端字符 ;

③ 规则用法 : 在字符串中 , 根据 AwA \to w 规则进行替换 , 只需要将 AA 变元替换成 ww 字符串即可 ;

④ 规则示例 : uAvuAv 中使用上述规则进行替换 , 将 AA 替换成 ww , 替换结果是得到新字符串 uwvuwv ;

uAvuwvuAv \Rightarrow uwv





III . 语法



1 . 有限次规则替换 : uvu \Rightarrow *v 表示有限多次替换后 , 每一步替换的临时结果序列组成集合 {u1,u2,,uk}\{u_1 , u_2 , \cdots , u_k\} , 最终结果是 终端字符 ;


2 . 有限次规则替换 步骤 :


  • uu 根据某规则进行替换得到 u1u_1 ;
  • u1u_1 根据某规则进行替换得到 u2u_2 ;
  • \vdots
  • uku_k 根据某规则进行替换得到 vv ;

3 . 最终规则替换结果要求 : vv 中不包含变元 , 全部由 终端字符 ( 常元 ) 组成的 字符串 ;

vv 是由 uu 生成的 ;


4 . 语法定义 : 从开始变元 , 使用规则逐步替换 , 替换到最后 , 将所有 终端字符组成字符串 放在一个集合中 , 称为语法生成的语言 ;

L(G)={wΣ:Sw}L(G) = \{ w \in \Sigma^* : S \Rightarrow *w \}





IV . 语法示例



1 . 语法组成部分 : G3=(  {S},{a,b},R,S  )G3 =( \; \{ S \}, \{ a, b \}, R , S \; ) 其组成如下 :


  • 变量集 {S}\{ S \} ;

  • 终端字符集 {a,b}\{ a, b \} ;

  • 规则 RR ;

  • 开始变量 SS ;


2 . 规则 RR 描述 :

SaSb    SS    εS \to aSb \; | \; SS \; | \; \varepsilon

  • SS 变量 可以使用 aSbaSb 字符串替换 ;
  • SS 变量 可以使用 SSSS 字符串替换 ;
  • SS 变量 可以使用 ε\varepsilon 字符串替换 ;

3 . 规则替换过程 :


SS 是开始变量 , 可以使用 aSbaSb 替换 :

SaSbS \Rightarrow aSb


使用 aSbaSb 替换 SS :

SaSbaaSbbS \Rightarrow aSb \Rightarrow aaSbb


使用 SSSS 替换 SS :

SaSbaaSbbaaSSbbS \Rightarrow aSb \Rightarrow aaSbb \Rightarrow aaSSbb


使用 aSbaSb 替换第一个 SS :

SaSbaaSbbaaSSbbaaaSbSbbS \Rightarrow aSb \Rightarrow aaSbb \Rightarrow aaSSbb \Rightarrow aaaSbSbb


使用 ε\varepsilon 替换第一个 SS :

SaSbaaSbbaaSSbbaaaSbSbbaaabSbbS \Rightarrow aSb \Rightarrow aaSbb \Rightarrow aaSSbb \Rightarrow aaaSbSbb \Rightarrow aaabSbb


使用 aSbaSb 替换 SS :

SaSbaaSbbaaSSbbaaaSbSbbaaabSbbaaabaSbbbS \Rightarrow aSb \Rightarrow aaSbb \Rightarrow aaSSbb \Rightarrow aaaSbSbb \Rightarrow aaabSbb \Rightarrow aaabaSbbb


使用 ε\varepsilon 替换 SS :

SaSbaaSbbaaSSbbaaaSbSbbaaabSbbaaabaSbbbaaababbbS \Rightarrow aSb \Rightarrow aaSbb \Rightarrow aaSSbb \Rightarrow aaaSbSbb \Rightarrow aaabSbb \Rightarrow aaabaSbbb \Rightarrow aaababbb


最终得到 aaababbbaaababbb 字符串 , 该字符串全部由终端字符构成 , 是从 SS 开始状态出发 , 按照 RR 规则替换得来的 ;

称该字符串由 语法 G3G3 生成的 ;





V . 语法简写形式



语法可以使用下面的形式简单表示 , 没有必要使用繁琐的形式 , 可以使用约定的简写形式 ;


约定写法 :

  • A0A1A \to 0A1
  • ABA \to B
  • BlB \to l

开始状态约定 : 左上方的变元 AA 约定是 开始变元 ;

变元约定 : 大写字母 A,BA,B 约定为 变元 ;

终端字符约定 : 小写字母 约定为 终端字符 ;





VI . 语法分析树



语法分析树 : 字符串生成的过程 , 可以写成语法分析树 ;


将上述 简写的 约定语法描述 , 生成 终端字符构成的字符串 ;


1 . 开始状态 : AA , 使用 0A10A1 替换 AA ;

A0A1A \Rightarrow 0A1

当前语法分析树 :

【计算理论】上下文无关语法 ( 语法组成 | 规则 | 语法 | 语法示例 | 约定的简写形式 | 语法分析树 )


2 . 使用 0A10A1 替换 AA ;

A0A100A11A \Rightarrow 0A1 \Rightarrow 00A11

当前语法分析树 :

【计算理论】上下文无关语法 ( 语法组成 | 规则 | 语法 | 语法示例 | 约定的简写形式 | 语法分析树 )


3 . 使用 0A10A1 替换 AA ;

A0A100A11000A111A \Rightarrow 0A1 \Rightarrow 00A11 \Rightarrow 000A111

当前语法分析树 :

【计算理论】上下文无关语法 ( 语法组成 | 规则 | 语法 | 语法示例 | 约定的简写形式 | 语法分析树 )


4 . 使用 BB 替换 AA ;

A0A100A11000A111000B111A \Rightarrow 0A1 \Rightarrow 00A11 \Rightarrow 000A111 \Rightarrow 000B111

当前语法分析树 :

【计算理论】上下文无关语法 ( 语法组成 | 规则 | 语法 | 语法示例 | 约定的简写形式 | 语法分析树 )


5 . 使用 ll 替换 BB ;

A0A100A11000A111000B111000l111A \Rightarrow 0A1 \Rightarrow 00A11 \Rightarrow 000A111 \Rightarrow 000B111 \Rightarrow 000l111

当前语法分析树 :

【计算理论】上下文无关语法 ( 语法组成 | 规则 | 语法 | 语法示例 | 约定的简写形式 | 语法分析树 )


6 . 最终得到的字符串为 000l111000l111 ;





VII . 代数表达式 语法



1 . 代数表达式 语法 : G4=(V,A,R,Expression)G4 = ( V , A , R , Expression ) 是代数表达式语法 ;


① 终端字符集 : A={a,+,×,()}A = \{ a , + , \times , () \} ;

② 变量集 : V={Expression,Term,Factor}V = \{ Expression , Term , Factor \} ;

  • ExpressionExpression 是表达式 ;
  • TermTerm 是项 ;
  • FactorFactor 是因子 ;

2 . ExpressionExpression 表达式 规则 :

ExpressionExpression+TermTermExpression \to Expression + Term | Term

ExpressionExpression ( 表达式 ) 可以通过 Expression+TermTermExpression + Term | Term 代替 ;


3 . TermTerm 项 规则 :

TermTerm×FactorFactorTerm \to Term \times Factor | Factor

TermTerm 项 可以通过 Term×FactorFactorTerm \times Factor | Factor 代替 ;


4 . FactorFactor 因子 规则 :

FactorExpressionaFactor \to Expression | a

FactorFactor 因子 可以通过 ExpressionaExpression | a 代替 ;