【计算理论】上下文无关语法 ( 代数表达式 | 代数表达式示例 | 确定性有限自动机 DFA 转为 上下文无关语法 )





I . 代数表达式 语法



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 \quad | \quad Term

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


3 . TermTerm 项 规则 :

TermTerm×FactorFactorTerm \to Term \times Factor \quad | \quad Factor

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


4 . FactorFactor 因子 规则 :

FactorExpressionaFactor \to Expression \quad | \quad a

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





II . 代数表达式 语法 示例



为字符串 (a+a)×a(a + a) \times a 构建 语法分析树 ;


1 . 起始状态 : 语法的起始状态是 ExpressionExpression , 根据 ExpressionExpression+TermTermExpression \to Expression + Term \quad | \quad Term 规则 , ExpressionExpression 可以使用 TermTerm 替换 , 直接从起始状态 , 使用 TermTerm 替换 ExpressionExpression ;

【计算理论】上下文无关语法 ( 代数表达式 | 代数表达式示例 | 确定性有限自动机 DFA 转为 上下文无关语法 )


2 . (a+a)×a(a + a) \times a 字符串的语法分析树 :


符号 : 其中有 ×\times 乘号 ;

语法分析树 : (a+a)×a(a + a) \times a 中间有 ×\times , 带有 ×\times 乘号的替换规则为 TermTerm×FactorFactorTerm \to Term \times Factor | Factor , 显然该项很显然是一个 TermTerm 项 ;

【计算理论】上下文无关语法 ( 代数表达式 | 代数表达式示例 | 确定性有限自动机 DFA 转为 上下文无关语法 )


3 . 根据上述 TermTerm×FactorTerm \to Term \times Factor 可知 , TermTerm 是由 Term×FactorTerm \times Factor 进行替换的 , 左侧的 (a+a)(a + a) 是一个 TermTerm , 右侧的 aa 是一个 FactorFactor ;

【计算理论】上下文无关语法 ( 代数表达式 | 代数表达式示例 | 确定性有限自动机 DFA 转为 上下文无关语法 )


4 . 根据 FactorExpressionaFactor \to Expression | a 规则 , 右侧的 FactorFactor 直接使用 aa 进行替代 , 可得如下语法分析树 :

【计算理论】上下文无关语法 ( 代数表达式 | 代数表达式示例 | 确定性有限自动机 DFA 转为 上下文无关语法 )


5 . 想办法将左侧的 TermTerm 替换成 (a+a)(a + a) :


加法只能是 ExpressionExpression , 先替换成 ExpressionExpression ;


6 . 这里先使用 FactorFactor 替换 TermTerm : 使用规则 TermTerm×FactorFactorTerm \to Term \times Factor | Factor ;

【计算理论】上下文无关语法 ( 代数表达式 | 代数表达式示例 | 确定性有限自动机 DFA 转为 上下文无关语法 )


7 . 在使用 ExpressionExpression 替换 FactorFactor : 使用规则 FactorExpressionaFactor \to Expression | a ;

【计算理论】上下文无关语法 ( 代数表达式 | 代数表达式示例 | 确定性有限自动机 DFA 转为 上下文无关语法 )


8 . 使用 Expression+TermExpression + Term 替换 ExpressionExpression : 使用规则 ExpressionExpression+TermTermExpression \to Expression + Term | Term ;

【计算理论】上下文无关语法 ( 代数表达式 | 代数表达式示例 | 确定性有限自动机 DFA 转为 上下文无关语法 )


9 . 使用 TermTerm 替换 左侧的 ExpressionExpression : 使用规则 ExpressionExpression+TermTermExpression \to Expression + Term | Term ;

【计算理论】上下文无关语法 ( 代数表达式 | 代数表达式示例 | 确定性有限自动机 DFA 转为 上下文无关语法 )


10 . 使用 FactorFactor 替换左侧的 TermTerm : 使用规则 TermTerm×FactorFactorTerm \to Term \times Factor | Factor ;

【计算理论】上下文无关语法 ( 代数表达式 | 代数表达式示例 | 确定性有限自动机 DFA 转为 上下文无关语法 )


11 . 使用 aa 替换左侧的 FactorFactor : 使用规则 FactorExpressionaFactor \to Expression | a ;

【计算理论】上下文无关语法 ( 代数表达式 | 代数表达式示例 | 确定性有限自动机 DFA 转为 上下文无关语法 )


12 . 使用 FactorFactor 替换右侧的 TermTerm : 使用规则 TermTerm×FactorFactorTerm \to Term \times Factor | Factor ;

【计算理论】上下文无关语法 ( 代数表达式 | 代数表达式示例 | 确定性有限自动机 DFA 转为 上下文无关语法 )


13 . 使用 aa 替换右侧的 FactorFactor : 使用规则 FactorExpressionaFactor \to Expression | a ;

【计算理论】上下文无关语法 ( 代数表达式 | 代数表达式示例 | 确定性有限自动机 DFA 转为 上下文无关语法 )


最终的 语法分析树为 :

【计算理论】上下文无关语法 ( 代数表达式 | 代数表达式示例 | 确定性有限自动机 DFA 转为 上下文无关语法 )

此时可以得到语法分析树 ; 该语法分析树是一个代数表达式 ; 将该语法分析树写出 , 即可理解 上下文无关 语法 ;

代数表达式就是上下文无关的语法 ;





III . 设计 上下文无关语法



给定语言 , 设计上下文无关语法 , 使用该语法可以生成该语言 ;


上下文无关语法 设计技巧 : 将复杂的语言分解 , 化整为零 , 针对每个部分设计上下文无关的语法 , 最终将这些语法合并在一起 ;


上下文无关语法 与 自动机 : 如果给定的语言是正则语言 , 是由正则表达式表达的 , 能够找到一个自动机可以识别该语言 , 首先将语言转换成自动机 , 将自动机转化为上下文无关的语法 ;





IV . 确定性有限自动机 DFA 转为 上下文无关语法



1 . 确定性有限自动机 ( DFA ) 转为 上下文无关语法 ( CFG ) : 将 确定性有限自动机 ( DFA ) 的指令 , 转为 对应的 上下文无关语法 ( CFG ) 规则 :

δ(qi,a)=qjRiaRj\delta ( q_i, a ) = q_j \Rightarrow R_i \to aR_j

δ(qi,a)=qj\delta ( q_i, a ) = q_j 表示 qiq_i 状态下 , 读取字符 aa , 跳转到 qjq_j 状态 ;


【计算理论】上下文无关语法 ( 代数表达式 | 代数表达式示例 | 确定性有限自动机 DFA 转为 上下文无关语法 )

2 . 自动机的 状态跳转 转换成 规则 示例 : 上图中的 确定性有限自动机 , 开始状态 AA 读取 11 字符 转化成 BB 状态 , 表示成规则就是

RA1RBR_A \to 1R_B


3 . 自动机的状态 AA 读取 字符 aa 转换成另一个状态 BB , 都可以转换成对应的规则 RAaRBR_A \to aR_B ;


4 . 计算能力对比 : 上下文无关语法 的计算能力 要大于等于 自动机的计算能力 ;