10

Javascript で C ヘッダー ファイルを解析したいと思います。そのような利用可能なライブラリはありますか?それ以外の場合は、始めるのに役立つヒントはありますか?

更新:私の最終的な目標は、node-ffi のインターフェイスを自動的に構築することです。パーサーは、Javascript が理解できる形式を出力できる限り、必ずしも Javascript である必要はありません。自分で開発するのが非常に難しい場合は、おそらく既製のソリューションを使用する必要があります...?

4

3 に答える 3

8

clangをチェックする必要があります。

簡単なコマンドライン呼び出しの場合は、次のことを試すことができます。

clang -cc1 -ast-dump-xml myfile.h

clangまたは、十分に文書化されたパーサーライブラリを使用して独自のツールを構築することもできます。これにより、ASTが構築され、必要に応じて(おそらくJSONでの出力用に)ウォークできるようになります。

于 2012-11-01T15:54:58.260 に答える
4

入力として指定された文法を解析するためのJavaScriptコードを生成するpeg.jsを確認することから始めることができます。詳細はこちらhttps://pegjs.org/

次に、解析するヘッダーファイルの文法を作成または検索する必要があります。

于 2012-11-01T06:07:29.837 に答える
2

何か面白いものを見つけたので、私は自分の質問に答えます。

http://www.swig.org/Doc2.0/SWIGDocumentation.html#SWIG_nn2

Swigは、JavascriptからロードできるCヘッダーファイルのXML表現を出力できます。

例えば:

swig -module yaml -xmlout yaml.xml yaml.h

次のファイルを生成します(関数の以下のスニペットyaml_token_delete):

...

<cdecl id="16015" addr="0x10835d500" >
    <attributelist id="16016" addr="0x10835d500" >
        <attribute name="name" value="yaml_token_delete" id="16017" addr="0x1082b2d00" />
        <attribute name="sym_symtab" value="0x1081007e0" id="16018" addr="0x1081007e0" />
        <attribute name="view" value="globalfunctionHandler" id="16019" addr="0x1082b2d00" />
        <attribute name="kind" value="function" id="16020" addr="0x1082b2d00" />
        <attribute name="sym_name" value="yaml_token_delete" id="16021" addr="0x1082b2d00" />
        <attribute name="wrap_parms" value="0x10835d460" id="16022" addr="0x10835d460" />
        <attribute name="decl" value="f(p.yaml_token_t)." id="16023" addr="0x1082b2d00" />
        <attribute name="tmap_out" value="" id="16024" addr="0x1082b2d00" />
        <parmlist id="16025" addr="0x10835d460" >
            <parm id="16026">
                <attributelist id="16027" addr="0x10835d460" >
                    <attribute name="tmap_typecheck" value="void *vptr = 0;&#10;  int res = SWIG_ConvertPtr($input, &amp;vptr, SWIGTYPE_p_yaml_token_s, 0);&#10;  arg1 = SWIG_CheckState(res);" id="16028" addr="0x1082b2d00" />
                    <attribute name="tmap_typecheck_match_type" value="p.SWIGTYPE" id="16029" addr="0x1082b2d00" />
                    <attribute name="tmap_in_match_type" value="p.SWIGTYPE" id="16030" addr="0x1082b2d00" />
                    <attribute name="tmap_freearg_match_type" value="p.SWIGTYPE" id="16031" addr="0x1082b2d00" />
                    <attribute name="compactdefargs" value="1" id="16032" addr="0x1082b2d00" />
                    <attribute name="name" value="token" id="16033" addr="0x1082b2d00" />
                    <attribute name="emit_input" value="objv[1]" id="16034" addr="0x1082b2d00" />
                    <attribute name="tmap_typecheck_precedence" value="0" id="16035" addr="0x1082b2d00" />
                    <attribute name="tmap_in_numinputs" value="1" id="16036" addr="0x1082b2d00" />
                    <attribute name="tmap_in" value="res1 = SWIG_ConvertPtr(objv[1], &amp;argp1,SWIGTYPE_p_yaml_token_s, 0 |  0 );&#10;  if (!SWIG_IsOK(res1)) { &#10;    SWIG_exception_fail(SWIG_ArgError(res1), &quot;in method '&quot; &quot;$symname&quot; &quot;', argument &quot; &quot;1&quot;&quot; of type '&quot; &quot;yaml_token_t *&quot;&quot;'&quot;); &#10;  }&#10;  arg1 = (yaml_token_t *)(argp1);" id="16037" addr="0x1082b2d00" />

...
于 2012-11-01T07:55:41.720 に答える