已知布尔表达式文法G[B]为:-|||-B→BOT|T T→TaF|F F→nF|(B)|t|f-|||-(1)G[B]是算符优先文法吗?-|||-(2)若G[B]是算符优先文法,请给出输入串ntofat#的分析过程
时间: 2024-06-17 21:05:18 浏览: 153
(1) G[B]不是算符优先文法。因为存在左递归和二义性。
(2) 对于输入串"ntofat#":
首先将 "#" 压入栈中作为结束符,然后将起始符号 "B" 压入栈中,即栈中内容为 "#B"。
读入第一个字符 "n",根据 G[B] 的产生式,可以将 "B" 替换为 "T",即栈中内容变为 "#T"。此时,由于 "T" 中的第一个字符是 "n",因此需要进行移进操作,将 "n" 压入栈中,即栈中内容变为 "#Tn"。
读入第二个字符 "t",根据 G[B] 的产生式,可以将 "T" 替换为 "TaF",即栈中内容变为 "#TaFn"。此时,由于 "a" 的优先级高于 "t",因此需要进行移进操作,将 "t" 压入栈中,即栈中内容变为 "#TaFnt"。
读入第三个字符 "o",根据 G[B] 的产生式,可以将 "F" 替换为 "nF",即栈中内容变为 "#TaFnFt"。此时,由于 "#" 的优先级低于 "o",因此需要进行规约操作,将 "FnFt" 替换为 "F"。替换后的栈中内容为 "#TaFFt"。
读入第四个字符 "f",根据 G[B] 的产生式,可以将 "F" 替换为 "f",即栈中内容变为 "#TaFft"。此时,由于 "#" 的优先级低于 "f",因此需要进行规约操作,将 "Ff" 替换为 "T"。替换后的栈中内容为 "#TaTt"。
读入第五个字符 "a",根据 G[B] 的产生式,可以将 "T" 替换为 "TaF",即栈中内容变为 "#TaaFnFtt"。此时,由于 "a" 的优先级高于 "a",因此需要进行移进操作,将 "a" 压入栈中,即栈中内容变为 "#TaaFnFtta"。
读入最后一个字符 "t",根据 G[B] 的产生式,可以将 "F" 替换为 "t",即栈中内容变为 "#TaaFntta"。此时,由于 "#" 的优先级低于 "t",因此需要进行规约操作,将 "ntta" 替换为 "F"。替换后的栈中内容为 "#TaaFt"。
由于此时栈顶符号是非终结符号 "F",因此需要进行规约操作。根据 G[B] 的产生式可以得到:"aF→TaF→T→B"。规约后的栈中内容为 "#B"。
最终得到分析成功的结果。
阅读全文