UPDATE 我现在知道parser.h应该由parser.y的make系统生成。 Android.mk文件甚至有一个这样的条目:
edify_src_files:= \ lexer.l \ parser.y \ expr.c
但我似乎无法从中获取可执行文件。 (是的,可以删除,不是共享库)
我正在尝试自己编译Android Wifi Tether(http://code.google.com/p/android-wifi-tether/),在尝试编译与项目的JNI部分相关的一些C代码时,有一些奇怪的使用lex / yacc。
我之前从未处理过解析器所以我真的很紧张。在使用最新的ndk-build脚本(ndk-r5b)时,在排序其他一些问题后,我发现自己正在寻找一个parser.h头文件。我试图编译而不包括它,并且具有未定义引用的函数调用是:
所以我显然需要找到这个parser.h文件的路径,其中应该声明这些函数。问题是,通过发出一个locate命令,我得到了一个巨大的文件列表,在我的系统中有相同的名字,但似乎没有一个是我正在寻找的。 p>
有人可以给我一个灯吗?也许我需要安装一个开发包?
谢谢!
纳尔逊
答案 0 :(得分:1)
您可以找到以下定义:
YY_BUFFER_STATE yy_scan_string (yyconst char *yy_str );
YY_BUFFER_STATE yy_scan_bytes (yyconst char *bytes,int len );
在词法扫描程序的“.c”自动生成的文件中称为“lex”(或flex)。因此,如果您不打算自己编写它们,则需要mylex.l应用于lex,它通常会创建一个名为lex.yy.c的文件。
此文件可以与描述语法的语法分析器“.y”一起使用。在另一个名为“bison”或“yacc”的工具自动生成的“.c”中,你会发现:
int yyparse (void *YYPARSE_PARAM);
你可以指示yacc创建2个文件:parser.c和parser.h,它们都来自你需要编写的另一个文件,比方说,mygrammar.y。
所以,简而言之,你需要写:
然后运行:
您可以尝试在项目文件中找到mylex.l和mygrammar.y(可能有更好的名字)。如果项目没有为您提供源(.l和.y)扫描程序/解析器(lex.yy.c和parse.c / parser.h),则需要编写它们。
我希望这会对你有所帮助。
贝乔