0

我正在尝试将 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是空的,这令人惊讶,因为解析器确实看到了错误。

4

1 回答 1

0

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

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

就像mirb所做的那样

对于第二期,我不认识你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]]
        ^

于 2017-04-19T22:19:50.180 回答