【问题标题】:Embedding mRuby: retrieving mrb_parser_message after parse error嵌入 mRuby:解析错误后检索 mrb_parser_message
【发布时间】:2017-08-28 18:42:45
【问题描述】:

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

是否有一种特殊的方法可以在解析代码之前设置解析器,以便在发生错误时正确填充其 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 为空,这令人惊讶,因为解析器确实看到了错误。

【问题讨论】:

    标签: parsing error-handling embedding mruby


    【解决方案1】:

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

    1. 捕获脚本的语法错误而不是打印。
    2. MRB_DISABLE_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);
    

    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 表示第一行的第 8 列(指向不必要的]),所以看起来你的 C 代码对我来说工作正常。

    (作为参考,您的代码在 CRuby 中的编译错误: https://wandbox.org/permlink/KRIlW2956TnS6puD)

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

    【讨论】:

    • 也许问题没有明确说明。该错误是预期的,我知道错误输出的含义。问题是双重的:首先,解析器的常规流上不应该有直接输出,因为我已经编译了定义了 MRB_DISABLE_STDIO 的 mRuby,并且按照 mrbconf.md 的第 14 行和以下建议。其次,我的代码尝试从解析器显式捕获错误消息,据我了解,该错误消息应该在 mrb_parse_string 返回的 mrb_parser_state 结构中可用,但事实并非如此。我编辑了问题以使其更清楚(我希望)。
    • @Jjule 更新了答案。
    • 有效!非常感谢 !让我丧命的是,我在搜索 error_buffer 的源代码后确实阅读了 mirb 源代码。显然,启用错误捕获还可以防止解析器自己输出错误消息,从而删除不需要的第一行输出。并感谢您解释如何传递编译器标志。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-20
    • 2017-09-04
    相关资源
    最近更新 更多