我想用 Javascript 解析 C 头文件。有没有这样的图书馆?否则,有什么提示可以帮助我入门吗?
更新:我的最终目标是为node-ffi自动构建接口。解析器不一定必须使用 Javascript,只要它可以吐出 Javascript 可以理解的格式即可。如果自己开发非常困难,我可能不得不使用现成的解决方案......?
我想用 Javascript 解析 C 头文件。有没有这样的图书馆?否则,有什么提示可以帮助我入门吗?
更新:我的最终目标是为node-ffi自动构建接口。解析器不一定必须使用 Javascript,只要它可以吐出 Javascript 可以理解的格式即可。如果自己开发非常困难,我可能不得不使用现成的解决方案......?
您可以从查看 peg.js 开始,它生成 javascript 代码来解析作为输入给出的语法。可在此处获取详细信息https://pegjs.org/
然后,您需要为要解析的头文件编写或查找语法。
好吧,我会回答我自己的问题,因为我发现了一些有趣的东西:
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; int res = SWIG_ConvertPtr($input, &vptr, SWIGTYPE_p_yaml_token_s, 0); 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], &argp1,SWIGTYPE_p_yaml_token_s, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "$symname" "', argument " "1"" of type '" "yaml_token_t *""'"); } arg1 = (yaml_token_t *)(argp1);" id="16037" addr="0x1082b2d00" />
...