Yacc--“错误”是什么意思?

雷切尔

令牌“错误”的含义是什么?如何在没有的情况下检测错误;

error伪终端匹配时,野牛解析器继续以正常的方式来分析,除了它丢弃其中“不能被处理的”令牌。

如果它遇到紧跟在该error令牌之后的令牌,它可以移动该令牌,这意味着它将停止丢弃令牌。

然而,这并不是解析器处理令牌的唯一方式。它也可以通过减少处理它。

在这里,“处理”这个词的解释有点松散,因为减少操作实际上并不接受前瞻标记。尽管如此,减少错误产生就足够了。

在这种情况下,必须注意不要调用yyerrok如果错误处理被取消yyerrok并且前瞻标记不能被移动,那么错误处理程序将被重新进入并且有可能陷入无限循环。

例如,

commands: %empty | commands command

command : exp ';'   { printf("Value is %d\n", $1); }
        | error ';' { printf("Bad expression\n"); yyerrok; }
        | error     { printf("Missing semicolon\n"); }

第一个command产生式导致打印出正确表达式的结果。第二个产生式处理仍然存在分号的语法错误。它可以取消错误处理,因为;已经被转移,所以可以重新启动错误处理。

第三个产生处理丢失的分号。在这里,我们无法调用,yyerrok因为前瞻标记可能是非法标记,例如!如果我们调用yyerrok,错误状态将被清除,错误处理将立即使用与前瞻标记相同的感叹号重新进入,从而导致无限循环。但是没有yyerrok,解析器仍处于错误处理模式,违规令牌将被丢弃。

注意:以上内容旨在帮助回答以下问题:errorerror令牌之后没有任何内容的生产会产生什么影响它不打算回答任何没有被问到的问题,例如“我如何做X?” (对于X 的各种值)。提供的示例有点人为。原始使用换行符作为表达式终止符,并且没有必要包含第二个错误处理产生式,因为除了 EOF 之外,实际上不可能省略终止换行符。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章