📅  最后修改于: 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)