微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如果 yyparse 失败,如何跳过部分野牛

如何解决如果 yyparse 失败,如何跳过部分野牛

所以基本上,在我的野牛文件中,如果 yyparse 失败(即存在语法错误),我想打印“错误”语句,而不是打印我在野牛文件的上述部分所做的任何其他事情,而实际上是 stmt 部分。如果 yyparse 返回 1 有没有办法跳过 bison 文件中间部分的内容?比如 idk 可能在 stmt 部分上面写 if 语句等?我将不胜感激任何帮助!提前致谢。

比如:

%{
#include "header.h"
#include <stdio.h>


void yyerror (const char *s) 
{}


extern int line;

%}

%token   ...///

%// some tokens types etc...
%union
{
  St class;
  int value;
  char* str;
  int line_num;
float float_value;
}

%start prog


%%
prog:       '[' stmtlst ']'
;

stmtlst:    stmtlst stmt |
;

stmt:       setStmt | if | print | unaryOperation | expr
        {
        if ($1.type==flt && $1.line_num!=0) {
               printf("Result of expression on %d is (",$1.line_num);
        printf( "%0.1f)\n",$1.float_value);
        $$.type=flt;
        }
               else if ($1.type==integer && $1.line_num!=0){
        $$.type=integer;
              printf("Result of expression on %d is (%d)\n",$1.line_num,$1.value);
                }
                else if ($1.type==string && $1.line_num!=0) {
        $$.type=string;
              printf("Result of expression on %d is (%s)\n",$1.str);
                } 
        else if ($1.type==mismatch && $1.line_num!=0)
                {
        $$.type=mismatch;
                  printf("Type mismatch on %d \n",$1.line_num);

            }
    else{ }
 }
%%

int main ()
{
if (yyparse()) {
// if parse error happens only print this printf and not above stmt part
printf("ERROR\n");
return 1;
}
else {
// successful parsing
return 0;
}
}

解决方法

不幸的是,时间旅行不是一种选择。当检测到错误时,printf 调用已经发生。你不能让他们不开心。

您可以(如果您正在编写编译器而不是计算器,则必须这样做)是创建一些表示已解析程序的数据结构,而不是尝试立即执行它。该数据结构——可以是抽象语法树 (AST) 或三地址指令列表,或其他任何内容,将用于生成编译程序。只有在编译的程序运行时才会对语句进行评估。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。