📜  下推式自动机和解析

📅  最后修改于: 2020-11-26 10:21:54             🧑  作者: Mango


解析用于使用语法的产生规则派生字符串。它用于检查字符串的可接受性。编译器用于检查字符串在语法上是否正确。解析器接受输入并构建解析树。

解析器可以有两种类型-

  • 自上而下的解析器-自上而下的解析是从顶部以开始符号开始的,并使用解析树派生一个字符串。

  • 自下而上的解析器-自下而上的解析从字符串的底部开始,并使用解析树到达开始符号。

自上而下的解析器设计

对于自上而下的解析,PDA具有以下四种转换类型:

  • 将产品左侧的非终端弹出到堆栈顶部,然后推动其右侧字符串。

  • 如果堆栈的顶部符号与正在读取的输入符号匹配,则将其弹出。

  • 将开始符号“ S”推入堆栈。

  • 如果输入字符串已被完全读取且堆栈为空,请进入最终状态’F’。

使用以下生成规则,为语法G设计一个自上而下的解析器,用于表达式“ x + y * z”-

P:S→S + X | X, X→X * Y | Y, Y→(S)| ID

如果PDA为(Q,∑,S,δ,q 0 ,I,F),则自上而下的解析为-

(x + y * z,I)⊢(x + y * z,SI)⊢(x + y * z,S + XI)⊢(x + y * z,X + XI)

⊢(x + y * z,Y + XI)⊢(x + y * z,x + XI)⊢(+ y * z,+ XI)⊢(y * z,XI)

⊢(y * z,X * YI)⊢(y * z,y * YI)⊢(* z,* YI)⊢(z,YI)⊢(z,zI)⊢(ε,I)

自底向上解析器的设计

对于自下而上的解析,PDA具有以下四种转换类型:

  • 将当前输入符号推入堆栈。

  • 用堆栈的左侧替换产品顶部的右侧。

  • 如果堆栈元素的顶部与当前输入符号匹配,则将其弹出。

  • 如果输入字符串已被完全读取,并且仅当起始符号’S’保留在堆栈中时,将其弹出并进入最终状态’F’。

使用以下生成规则,为语法G设计一个自上而下的解析器,用于表达式“ x + y * z”-

P:S→S + X | X, X→X * Y | Y, Y→(S)| ID

如果PDA为(Q,∑,S,δ,q 0 ,I,F),则自下而上的解析为-

(x + y * z,I)⊢(+ y * z,xI)⊢(+ y * z,YI)⊢(+ y * z,XI)⊢(+ y * z,SI)

⊢(y * z,+ SI)⊢(* z,y + SI)⊢(* z,Y + SI)⊢(* z,X + SI)⊢(z,* X + SI)

⊢(ε,z * X + SI)⊢(ε,Y * X + SI)⊢(ε,X + SI)⊢(ε,SI)