Parsing 嵌入mRuby:在解析错误后检索mrb_parser_消息

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的来源,但看起来不像。我迷路了。下面是我正在使用的代码

我正在尝试将mRuby嵌入到一个对象中。我要设置的第一件事是在Max IDE控制台窗口中记录错误。为此,在使用mrb_parse_string解析代码(存储在C字符串中)后,我希望解析器的error_缓冲区数组中会出现错误,但即使出现错误,该数组中的结构也始终为空(lineno和column设置为0,message设置为NULL)

在解析代码之前,是否有一种特殊的方法来设置解析器,以便在发生错误时正确填充其错误缓冲区数组?我已经调查了mirb的来源,但看起来不像。我迷路了。下面是我正在使用的代码,取自我正在用作测试的一个小C程序:

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
    工作
  • 第1期

    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]]
            ^