Parsing 嵌入mRuby:在解析错误后检索mrb_parser_消息
我正在尝试将mRuby嵌入到一个对象中。我要设置的第一件事是在Max IDE控制台窗口中记录错误。为此,在使用mrb_parse_string解析代码(存储在C字符串中)后,我希望解析器的error_缓冲区数组中会出现错误,但即使出现错误,该数组中的结构也始终为空(lineno和column设置为0,message设置为NULL) 在解析代码之前,是否有一种特殊的方法来设置解析器,以便在发生错误时正确填充其错误缓冲区数组?我已经调查了mirb的来源,但看起来不像。我迷路了。下面是我正在使用的代码,取自我正在用作测试的一个小C程序:Parsing 嵌入mRuby:在解析错误后检索mrb_parser_消息,parsing,error-handling,embedding,mruby,Parsing,Error Handling,Embedding,Mruby,我正在尝试将mRuby嵌入到一个对象中。我要设置的第一件事是在Max IDE控制台窗口中记录错误。为此,在使用mrb_parse_string解析代码(存储在C字符串中)后,我希望解析器的error_缓冲区数组中会出现错误,但即使出现错误,该数组中的结构也始终为空(lineno和column设置为0,message设置为NULL) 在解析代码之前,是否有一种特殊的方法来设置解析器,以便在发生错误时正确填充其错误缓冲区数组?我已经调查了mirb的来源,但看起来不像。我迷路了。下面是我正在使用的代码
mrb_state *mrb;
char *code;
struct mrb_parser_state *parser;
parser = mrb_parse_string(mrb, code, mrbc_context_new(mrb));
if (parser->nerr > 0) {
for(i = 0; i < parser->nerr; i++) {
printf("line %d:%d: %s\n", parser->error_buffer[i].lineno,
parser->error_buffer[i].column,
parser->error_buffer[i].message);
}
return -1;
}
前面的代码输出:
line 1:8: syntax error, unexpected ']', expecting $end
line 0:0: (null)
我不知道第一行是从哪里来的,因为我用MRB_DISABLE_STDIO编译了mRuby,正如mrbconf.md中第14行和后面的建议一样,但它是准确的
第二行是我的代码的实际输出,显示返回的
mrb\u parser\u state
结构的error\u buffer
为空,这令人惊讶,因为解析器确实看到了一个错误。对不起,完全误解了您的问题。
所以你想:
MRB\u禁用\u STDIO
工作struct mrb_parser_state *parser;
parser = mrb_parse_string(mrb, code, mrbc_context_new(mrb));
应替换为:
struct mrbc_context *cxt;
struct mrb_parser_state *parser;
cxt = mrbc_context_new(mrb);
cxt->capture_errors = TRUE;
parser = mrb_parse_string(mrb, code, cxt);
对于第二期,我不知道您的build\u config.rb
,所以我不能说太多。
让事情变得准确的一些注意事项:
MRB\u DISABLE\u STDIO
是构建mruby的编译标志,因此需要将其传递到build\u config.rb
中,如:
cc.defines << %w(MRB_DISABLE_STDIO)
也许这个问题没有说清楚。错误是预期的,我知道错误输出的含义。问题有两个方面:首先,在解析器的常规流上不应该有直接输出,因为我用定义了MRB_DISABLE_STDIO的mRuby编译了mRuby,正如mrbconf.md的第14行和后面的建议。其次,我的代码试图显式地从解析器捕获错误消息,据我所知,该消息应该在mrb_parser_字符串返回的mrb_parser_状态结构中可用,但它不是。我编辑了这个问题以使它更清晰(我希望)。@Jujule更新了答案。它很有效!谢谢!最要命的是,我在对源代码进行了
error\u buffer
灰色化后,确实读取了mirb source。显然,启用错误捕获还可以防止解析器自己输出错误消息,从而删除不需要的第一行输出。感谢您解释如何传递编译器标志。
cc.defines << %w(MRB_DISABLE_STDIO)
prog.rb:1: syntax error, unexpected ']', expecting end-of-input
[1,1,1]]
^