C语言分析器在Javascript中

我想用JavaScriptparsingC头文件。 有没有这样的图书馆? 否则,任何提示,以帮助我开始?

更新:我的最终目标是自动为node-ffi构build接口。 parsing器不一定必须使用Javascript,只要它可以吐出Javascript可以理解的格式即可。 如果我自己很难发展,我可能不得不采用现成的解决scheme…?

你应该检查铛 。

对于一个简单的命令行调用,你可以试试这个:

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

或者你可以使用clang合理logging的parsing器库来构build自己的工具,它将为你构build一个AST,并让你按照你认为适合的方式(可能用于JSON输出)来执行它。

您可能会先查看生成JavaScript代码的peg.js,以parsing给定的语法作为input。 在这里http://pegjs.majda.cz可用的详细信息

然后哟需要写或find你想分析的头文件的语法。

那么我会回答我自己的问题,因为我发现一些有趣的事情:

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

Swig可以输出C头文件的XML表示,然后我可以从Javascript加载。

例如:

 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" /> ...