嵌入mRuby:解析错误后检索mrb_parser_message

时间:2017-04-03 19:06:23

标签: parsing error-handling embedding mruby

我正在尝试将mRuby嵌入Max MSP对象中。我想要设置的第一件事是Max IDE控制台窗口中的错误记录。为此,在使用mrb_parse_string解析代码(存储在C字符串中)之后,我希望错误在解析器的error_buffer数组中可用,但此数组中的结构始终为空(lineno和列设置为0并且消息集即使出现错误也是如此。

在解析代码之前是否有一种特殊的方法来设置解析器,以便在发生错误时正确填充其error_buffer数组?我查看了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;
}

传递以下错误的ruby代码时:

[1,1,1]]

以前的代码输出:

line 1:8: syntax error, unexpected ']', expecting $end
line 0:0: (null)

我不知道第一行来自哪里,因为我编译了mRuby并定义了MRB_DISABLE_STDIO,并且作为第14行和mrbconf.md中的后续内容建议,但它是准确的。

第二行是我的代码的实际输出,并显示返回的mrb_parser_state结构的error_buffer为空,这是令人惊讶的,因为解析器确实看到了错误。

1 个答案:

答案 0 :(得分:0)

很抱歉完全误解了你的问题。 所以你想:

  1. 捕获脚本的语法错误而不是打印。
  2. MRB_DISABLE_STDIO工作。
  3. 第一期

    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);
    

    like what mirb does

    对于第二期,我不知道你的build_config.rb,所以我不能说太多。 一些使事情准确的说明:

    MRB_DISABLE_STDIO是用于构建mruby的编译标志,因此您需要在build_config.rb中传递它:

    cc.defines << %w(MRB_DISABLE_STDIO)
    

    (见build_config_ArduinoDue.rb

        第1:8行:语法错误,意外']',期待$ end

    是mruby解析器的解析错误([1,1,1]]必须是[1,1,1])。 1:8表示第1行的第8列(指向不必要的]),因此看起来您的C代码对我来说正常。

    (为了参考你的代码在CRuby中的编译错误: https://wandbox.org/permlink/KRIlW2956TnS6puD

    prog.rb:1: syntax error, unexpected ']', expecting end-of-input
    [1,1,1]]
            ^