首页 理论教育 算符优先分析:出错处理技巧

算符优先分析:出错处理技巧

时间:2023-11-17 理论教育 版权反馈
【摘要】:算符优先分析过程中,当栈顶终结符号与下一输入符号之间不存在任何优先关系时将产生语法错误。在优先关系表中的空项中,可填入指向处理该项错误的子程序的指示器。表5-9优先关系表表5-10对输入串)i)带错误处理的算符优先分析过程除了不具有优先关系,算符优先分析的语法错误还包括找到素短语,却不存在于值对应的产生式的右部。注意,在使用算符优先分析法时,非终结符的处理是隐匿的。

算符优先分析:出错处理技巧

算符优先分析过程中,当栈顶终结符号与下一输入符号之间不存在任何优先关系时将产生语法错误。此时,通常采用在输入端改变、插入或删除符号的方式进行处理。在优先关系表中的空项中,可填入指向处理该项错误的子程序的指示器。采用改变或插入符号的办法,必须注意不要造成无穷的重复过程,始终不能将栈内的符号串归约或将符号移入栈顶。

假定a和b是栈顶上的两个符号(b在顶上),c和d为输入符号串中前两个符号,且b和c之间不存在任何关系。若ac,则将b从栈顶移去;若bd,则将c删除。另外一种可能是找出某个e,使得或ec,并将e插入输入端c的前面。一般而言,若不能找到单个符号,也可插入一串符号,使得be1e2enc,选取的办法视具体情况而定。

例如,表5-9所示的优先矩阵是在表5-4的空项内填上各种不同的处理错误子程序后的结果。每个处理错误子程序进行如下工作:

e1表达式以左括号结尾:从栈顶删除‘(’,给出错误信息“非法左括号”

e2标识符i或)后跟i或(:输入端插入‘+’,给出错误信息“缺少运算符”

e3表达式以右括号开始:删除输入端‘)’,给出错误信息“非法右括号”

e4缺少表达式:若栈顶有非终结符N,则表达式分析完毕。若为空,则在输入端插入i,给出错误信息“缺少表达式”

利用表5-9对输入串w=)i)进行带错误处理的算符优先分析过程如表5-10所示。(www.xing528.com)

表5-9 优先关系表(包括出错处理子程序)

表5-10 对输入串)i)带错误处理的算符优先分析过程

除了不具有优先关系,算符优先分析的语法错误还包括找到素短语,却不存在于值对应的产生式的右部。此时,错误处理子程序需要确定该“素短语”与哪个产生式的右部最相似。例如,假定从栈中确定的“素短语”是abc,可是,没有一个产生式,其右部包含a、b、c在一起。此时,可考虑是否删除a、b、c中的一个。假若有一个产生式其右部为a Ac B,则可给出错误信息:“非法b”;若另有一个产生式,其右部为abdc,则可给出错误信息“缺少d”。

注意,在使用算符优先分析法时,非终结符的处理是隐匿的。因此,当素短语与某一产生式右部相匹配时,则意味着其相应的终结符是相同的,而非终结符所占位置也是相同的。若有多个符号序列可以归约,则可设计一个通用的子程序去处理,以确定哪一个产生式右部与该归约序列的距离满足一定的界限(比如限定为1或2)。若存在这样的产生式,则假定以这个产生式为依据,并给出比较具体的错误信息。否则,可给出类似“语句有错”这样的一般性信息。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈