2017-04-03 13 views
0

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が空であることを示しています。パーザにエラーが発生したので驚くべきことです。

答えて

0

ご迷惑をおかけして申し訳ありません。 次のようにします。

  1. 印刷の代わりにスクリプトの構文エラーをキャプチャします。
  2. make MRB_DISABLE_STDIOです。

    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:第一の問題

    struct mrb_parser_state *parser; 
    
    parser = mrb_parse_string(mrb, code, mrbc_context_new(mrb)); 
    

    については

を置き換えてください。

私はあなたのbuild_config.rbを知らないので、それについてはあまり言えません。 いくつかの注意物事を正確にする:あなたは同じようbuild_config.rbにそれを渡す必要があるので、

MRB_DISABLE_STDIOはmrubyを構築するためのコンパイルフラグです:

cc.defines << %w(MRB_DISABLE_STDIO) 

build_config_ArduinoDue.rbを参照)

は、1行目: 8:文法エラー、予期しない ']'、$ end expect

は、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]] 
     ^

+0

たぶん質問は明記されませんでした。エラーが予想され、エラー出力の意味を知っています。問題は2つありました。まずMRB_DISABLE_STDIOを定義し、mrbconf.mdの14行目以降にmRubyをコンパイルしたので、パーサからの通常のストリームには直接出力はありません。次に、私のコードでは、パーサーからエラーメッセージを明示的に取り込み、mrb_parse_stringによって返されたmrb_parser_state構造体で利用できるはずですが、そうではありません。私はそれをより明確にするために質問を編集した(私が望む)。 – Jujule

+0

@Jujule答えを更新しました。 –

+0

それは動作します!どうもありがとう !何が私を殺すのは、私がerror_bufferのソースをグレープした後にmirbソースを読んだことです。明らかに、エラーキャプチャを有効にすると、パーサがエラーメッセージを単独で出力することもなくなり、不要な最初の出力行が削除されます。コンパイラフラグを渡す方法を説明してくれてありがとう。 – Jujule

関連する問題