Компиляция (flex / bison) парсера с помощью NDK - PullRequest
2 голосов
/ 20 марта 2011

UPDATE Теперь я знаю, что 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/) самостоятельно) и при попытке скомпилировать некоторый C-код, связанный с частью JNI проекта, есть странное использование lex / yacc.

Раньше я никогда не имел дело с парсерами, поэтому я действительно держу свои руки здесь крепко. При использовании последнего скрипта ndk-build (ndk-r5b) и после сортировки некоторых других проблем я обнаружил, что искал заголовочный файл parser.h. Я попытался скомпилировать, не включая его, и вызовы функций с неопределенными ссылками были:

  • yy_scan_string
  • yy_scan_bytes
  • yyparse

Так что мне явно нужно найти путь к этому файлу parser.h, где эти функции должны быть объявлены. Проблема в том, что, выполнив команду locate, я получаю огромный список файлов с одинаковыми именами в моей системе, но кажется, что ни один из них не является тем, который я ищу.

Может кто-нибудь дать мне свет здесь? может мне нужно установить пакет разработчика?

Спасибо!

Nelson

1 Ответ

1 голос
/ 23 марта 2011

Вы можете найти определение:

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", который описывает вашу грамматику. В другом ".c", автоматически сгенерированном этим другим инструментом, называемым "bison" или "yacc", вы найдете:

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), вам необходимо написать их.

Надеюсь, это поможет вам.

Беко

...