令牌“错误”的含义是什么?如何在没有的情况下检测错误;
后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
,解析器仍处于错误处理模式,违规令牌将被丢弃。
注意:以上内容旨在帮助回答以下问题:error
在error
令牌之后没有任何内容的生产会产生什么影响。它不打算回答任何没有被问到的问题,例如“我如何做X?” (对于X 的各种值)。提供的示例有点人为。原始使用换行符作为表达式终止符,并且没有必要包含第二个错误处理产生式,因为除了 EOF 之外,实际上不可能省略终止换行符。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句