Bison Yacc——“错误”是什么意思?

Bison Yacc——“错误”是什么意思?,bison,Bison,标记“错误”的含义是什么?如何在没有错误的情况下检测错误 匹配错误伪终端后,bison解析器继续以正常方式进行解析,但它会丢弃无法处理的令牌 如果遇到紧跟在错误令牌之后的令牌,它可以移动该令牌,这意味着它将停止丢弃令牌 但是,这不是解析器处理令牌的唯一方法。它也可以通过做一个减少来处理它 这里,handled一词的解释有点松散,因为reduction操作实际上并不接受lookahead标记。尽管如此,这足以减少误差产生 在这种情况下,必须注意不要打电话给yyerrok。如果使用yyerrok取消

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

匹配错误伪终端后,bison解析器继续以正常方式进行解析,但它会丢弃无法处理的令牌

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

但是,这不是解析器处理令牌的唯一方法。它也可以通过做一个减少来处理它

这里,handled一词的解释有点松散,因为reduction操作实际上并不接受lookahead标记。尽管如此,这足以减少误差产生

在这种情况下,必须注意不要打电话给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"); }
第一个命令生成导致输出正确表达式的结果。第二个产品处理仍然有分号的语法错误。它可以取消错误处理,因为;已被移动,因此可以重新启动错误处理

第三个产品涉及缺少的分号。在这里,我们不能调用yyerrok,因为前瞻令牌可能是非法令牌,例如!。如果我们调用yyerrok,错误状态将被清除,错误处理将立即以与前瞻标记相同的感叹号重新输入,从而导致无休止的循环。但是 如果没有yyerrok,解析器仍处于错误处理模式,并且将丢弃有问题的令牌

注:上述内容旨在帮助回答以下问题:在错误标记后面没有任何内容的情况下,错误生成会产生什么影响。它并不打算回答任何没有被问到的问题,比如我如何做X?对于不同的X值。提供的示例有点人为。原始版本使用换行符作为表达式终止符,不需要包含第二个错误处理结果,因为除了在EOF之外,实际上不可能省略终止换行符。

匹配错误伪终端后,bison解析器继续以正常方式解析,但它会丢弃无法处理的令牌

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

但是,这不是解析器处理令牌的唯一方法。它也可以通过做一个减少来处理它

这里,handled一词的解释有点松散,因为reduction操作实际上并不接受lookahead标记。尽管如此,这足以减少误差产生

在这种情况下,必须注意不要打电话给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"); }
第一个命令生成导致输出正确表达式的结果。第二个产品处理仍然有分号的语法错误。它可以取消错误处理,因为;已被移动,因此可以重新启动错误处理

第三个产品涉及缺少的分号。在这里,我们不能调用yyerrok,因为前瞻令牌可能是非法令牌,例如!。如果我们调用yyerrok,错误状态将被清除,错误处理将立即以与前瞻标记相同的感叹号重新输入,从而导致无休止的循环。但是 如果没有yyerrok,解析器仍处于错误处理模式,并且将丢弃有问题的令牌


注:上述内容旨在帮助回答以下问题:在错误标记后面没有任何内容的情况下,错误生成会产生什么影响。它并不打算回答任何没有被问到的问题,比如我如何做X?对于不同的X值。提供的示例有点人为。原始版本使用换行符作为表达式终止符,不需要包含第二个错误处理结果,因为除了在EOF时,实际上不可能省略终止换行符。

一个常见的混淆源-错误标记用于错误恢复,而不是错误检测。语法错误由解析器自动检测和报告。您可以使用YYERROR宏检测操作中的其他错误,并告知bison

从概念上讲,错误令牌替换零个或多个输入令牌序列,以尝试将无效输入流转换为有效输入流。当发生错误时,bison生成的解析器将进入错误恢复模式,丢弃令牌和状态,直到获得错误
到可以移动错误伪标记的点。然后,它移动错误标记并尝试从此处继续。

一个常见的混淆源-错误标记用于错误恢复,而不是错误检测。语法错误由解析器自动检测和报告。您可以使用YYERROR宏检测操作中的其他错误,并告知bison


从概念上讲,错误令牌替换零个或多个输入令牌序列,以尝试将无效输入流转换为有效输入流。当发生错误时,bison生成的解析器进入错误恢复模式,丢弃令牌和状态,直到到达可以移动错误伪令牌的点。然后,它移动错误标记并尝试从此处继续。

error的意思就是:解析器错误。它捕获错误,因此您可以自己处理,也可以自己进行恢复或自定义报告。错误的意思就是它所说的:解析器错误。它捕获错误,因此您可以自己处理,也可以自己进行恢复或自定义报告;ExtDefList:ExtDef ExtDefList{}|/*空*/{};ExtDef:说明符ExtDecList半{}。。。|错误SEMI{printfbad表达式%s\n,yytext;yyerrok;}|错误{printf缺少SEMI\n;}@瑞秋:这个评论根本不可能读出来,这通常意味着你应该问一个更具体的新问题。比如你的目标到底是什么,你尝试的东西是如何无法满足你的要求的。当然,在没有同步令牌的情况下,识别丢失的令牌并不总是那么容易;ExtDefList:ExtDef ExtDefList{}|/*空*/{};ExtDef:说明符ExtDecList半{}。。。|错误SEMI{printfbad表达式%s\n,yytext;yyerrok;}|错误{printf缺少SEMI\n;}@瑞秋:这个评论根本不可能读出来,这通常意味着你应该问一个更具体的新问题。比如你的目标到底是什么,你尝试的东西是如何无法满足你的要求的。但在没有同步令牌的情况下,识别丢失的令牌并不总是那么容易。