使用NDK编译(flex/bison)解析器

3

更新 我现在知道,parser.h应该由make系统从parser.y生成。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头文件。我尝试编译而不包括它,并且具有未定义引用的函数调用为:

  • yy_scan_string
  • yy_scan_bytes
  • yyparse

因此,我明显需要找到声明这些函数的parser.h文件的路径。问题是,通过发出locate命令,我会在我的系统中得到一个具有相同名称的大型文件列表,但似乎没有一个是我正在寻找的。

有人能帮我吗?也许我需要安装开发者包?

谢谢!

Nelson


你可能只需要安装flex和bison,这样构建脚本就可以使用它们来生成所需的parser.h和其他各种东西。 - Chris Dodd
我在系统中安装了flex和bison。我也能够通过Beco描述的过程生成所有的.c和.h文件。但是似乎Android的构建机制有些不同。从Makefile.mk文件中所写的内容来看,我得到的印象是ARM交叉编译器应该能够处理.y和.l文件并生成.c和.h文件。 - Bilthon
1个回答

1

您可以找到以下内容的定义:

YY_BUFFER_STATE yy_scan_string (yyconst char *yy_str  );
YY_BUFFER_STATE yy_scan_bytes (yyconst char *bytes,int len  );

在由词法扫描器“lex”(或flex)自动生成的“.c”文件中。因此,如果您不打算亲自编写它们,则需要一个mylex.l应用于lex,通常会创建一个名为lex.yy.c的文件。

这个文件可以与描述语法的语法解析器“.y”一起使用。在由另一个名为“bison”或“yacc”的工具自动生成的另一个“.c”文件中,您将找到:

int yyparse (void *YYPARSE_PARAM);

你可以指示yacc创建两个文件:parser.c和parser.h,这两个文件都来自另一个文件,你需要编写这个文件,比如说,mygrammar.y。

因此,简要地说,你需要编写:

  • mylex.l
  • mygrammar.y

然后运行:

  • flex mylex.l ==> 生成 lex.yy.c
  • bison --defines=parser.h --output=parser.c mygrammar.y ==> 生成 parser.h 和 parser.c

您可以尝试在项目文件中查找类似于 mylex.l 和 mygrammar.y 的文件(可能有更好的名称)。如果项目没有提供源代码(.l 和 .y)或者扫描器/解析器(lex.yy.c 和 parse.c/parser.h),那么您需要自己编写。

希望这能帮到您。

Beco


真的很好的答案,Beco!! 自从我第一次发布问题以来,我已经通过艰苦的方式找到了你所说的一些事情,但你所说的只是加强了我所做的是正确的路径。不过,我仍然无法想出一个二进制文件,原因可能与Android NDK的奇怪构建过程有关。 - Bilthon
谢谢。我很高兴能够提供帮助。希望你能顺利解决问题。;) - DrBeco

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接