簡體   English   中英

嵌入mRuby:解析錯誤后檢索mrb_parser_message

[英]Embedding mRuby: retrieving mrb_parser_message after parse error

我試圖將mRuby嵌入Max MSP對象中。 我要設置的第一件事是在Max IDE控制台窗口中記錄錯誤。 為此,在我使用mrb_parse_string解析代碼(存儲在C字符串中)后,我希望解析器的error_buffer數組中存在錯誤,但是此數組中的結構始終為空(lineno和column設置為0並設置消息集)至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;
}

通過以下錯誤的紅寶石代碼時:

[1,1,1]]

先前的代碼輸出:

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

我不知道第一行來自哪里,因為我編譯了mRuby並定義了MRB_DISABLE_STDIO,並在mrbconf.md中建議了第14行和以下內容,但這是准確的。

第二行是從我的代碼的實際輸出和顯示返回mrb_parser_state結構的error_buffer是空的,這是令人驚訝的,因為解析器沒有看到一個錯誤。

抱歉,完全誤解了您的問題。 因此,您要:

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM