Max MSPオブジェクトにmRubyを埋め込むようにしています。私がセットアップしたい最初のものの1つは、最大IDEコンソールウィンドウにエラーログを記録することです。その結果、mrb_parse_stringを使ってコードを解析した後、パーサーのerror_buffer配列でエラーが発生すると予想されますが、この配列の構造は常に空です(linenoとcolumnは0に設定され、メッセージセットエラーが発生した場合でもNULLを返します。埋め込みmRuby:解析エラー後にmrb_parser_messageを取得する
エラーが発生した場合のために、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]]
前のコード出力:
を最初の行はどこから来るか私が定義されており、としてライン14とmrbconf.mdに次MRB_DISABLE_STDIOでmRubyをコンパイルするので、私は、知らないline 1:8: syntax error, unexpected ']', expecting $end
line 0:0: (null)
は示唆して、それが正確です。
2行目はコードからの実際の出力で、返されたmrb_parser_state
構造体のerror_buffer
が空であることを示しています。パーザにエラーが発生したので驚くべきことです。
たぶん質問は明記されませんでした。エラーが予想され、エラー出力の意味を知っています。問題は2つありました。まずMRB_DISABLE_STDIOを定義し、mrbconf.mdの14行目以降にmRubyをコンパイルしたので、パーサからの通常のストリームには直接出力はありません。次に、私のコードでは、パーサーからエラーメッセージを明示的に取り込み、mrb_parse_stringによって返されたmrb_parser_state構造体で利用できるはずですが、そうではありません。私はそれをより明確にするために質問を編集した(私が望む)。 – Jujule
@Jujule答えを更新しました。 –
それは動作します!どうもありがとう !何が私を殺すのは、私が
error_buffer
のソースをグレープした後にmirbソースを読んだことです。明らかに、エラーキャプチャを有効にすると、パーサがエラーメッセージを単独で出力することもなくなり、不要な最初の出力行が削除されます。コンパイラフラグを渡す方法を説明してくれてありがとう。 – Jujule