gpt4 book ai didi

c++ - 在 Bison 中抛出异常并在 main() 中捕获

转载 作者:行者123 更新时间:2023-11-30 03:50:18 24 4
gpt4 key购买 nike

是否可以在我的 .y 文件中抛出异常并在启动 yyparse() 的 .l 中捕获它?

让我们编写一些示例代码。这是我的 .y 文件的一部分:

%{
#include <stdio.h>
#include <string>
#include <cstring>

using namespace std;

extern int yylex();
extern void yyerror(char*);

typedef enum { ZERO_DIVISION = 0,
VAR_DUPLICATE_NAME = 1,
...
GENERAL = 100
} e_errors;
const char* e_errNames[] = {"ZERO_DIVISION","VAR_DUPLICATE_NAME",...,"GENERAL"};
...

%}

//Symbols
%union
{
...
};

%token ...

%start X1

%%

X1:
BEGIN
....
END
;
{
...

if(myCheck(i)>=0) throw VAR_DUPLICATE_NAME;

...
}
;
...

%%

这就是我试图在我的 .l 文件中以错误的方式捕获 VAR_DUPLICATE_NAME 的方式:

%{
#include <string.h>
#include "proxydata.tab.h"

void yyerror(char*);
int yyparse(void);

char linebuf[500]; //for output the row in case of syntax error

%}

%option yylineno

blanks [ \t\n]+
text [a-zA-Z0-9]+|[0-9]+.[0-9]+
%%

\n.* { /* saving the next row in case of syntax error */
strncpy(linebuf, yytext+1, sizeof(linebuf)); /* save the next line */
yyless(1); /* give back all but the \n to rescan */
}

{blanks} { /* ignore */ };


... return(...);

{text} { yylval.str_val=(char*)strdup(yytext);
return(IDENTIFIER);
}

. return yytext[0];

%%

void yyerror(char *s){
printf("LINE %d: %s at %s in this line:\n%s\n", yylineno, s, yytext, linebuf);
}

int yywrap (void){
;
}

int main(int num_args, char** args){
if(num_args != 2) {printf("usage: ./parser filename\n"); exit(0);}
FILE* file = fopen(args[1],"r");
if(file == NULL) {printf("couldn't open %s\n",args[1]); exit(0);}
yyin = file;

try{
yyparse();
}catch(int err){
printf("ERROR! %s",e_errNames[err]);
}

fclose(file);
}

这样,解析器就被正确创建了,但是当我输入一个生成异常的文件时,我会遇到以下消息:

terminate called after throwing an instance of 'e_errors' Aborted (core dumped)

我知道在写 printf("ERROR! %s",e_errNames[err]) 之前,我也应该声明。这个 extern const char* e_errNames[]; 放在 flex 文件的顶部就足够了吗?

最佳答案

您应该按照设计者的意图调用 yyerror() 或 YY_ABORT。解析器不应抛出异常,除非它们出现故障。而且您不希望解析中只有一个错误,您需要所有错误。

请注意,您实际上并没有在 flex 中捕捉到错误。 您是在 main() 中捕捉到它,它可以在任何地方。 yyparse() 调用 yylex(),而不是相反。 yyparse() 抛出的任何内容都可能被 main() 或您提供的任何其他调用它的东西捕获,但不会被 yylex() 捕获。

关于c++ - 在 Bison 中抛出异常并在 main() 中捕获,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31883592/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com