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

时间:2011-03-19 21:38:48

标签: compiler-construction android-ndk yacc bison lexical


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头文件。我试图编译而不包括它,并且具有未定义引用的函数调用是:

  • yy_scan_string
  • yy_scan_bytes
  • yyparse

所以我显然需要找到这个parser.h文件的路径,其中应该声明这些函数。问题是,通过发出一个locate命令,我得到了一个巨大的文件列表,在我的系统中有相同的名字,但似乎没有一个是我正在寻找的。

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

谢谢!

纳尔逊

1 个答案:

答案 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

然后运行:

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

我希望这会对你有所帮助。

贝乔