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 文件的路径。问题是,通过发出定位命令,我在系统中获得了大量同名文件,但似乎没有一个是我正在寻找的文件。

有人可以在这里给我一盏灯吗?也许我需要安装一个开发者包?

谢谢!

尼尔森

4

1 回答 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 创建 2 个文件:parser.c 和 parser.h,它们都来自您需要编写的另一个文件,比如说 mygrammar.y。

所以,简单地说,你需要写:

  • mylex变种l
  • 我的语法

然后运行:

  • 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),您需要编写它们。

我希望这可以帮助你。

贝科

于 2011-03-23T15:29:10.563 回答