Компиляция (flex/bison) парсера с помощью NDK
ОБНОВЛЕНИЕ Теперь я знаю, что 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, я получаю огромный список файлов с одинаковыми именами в моей системе, но кажется, что ни один из них не является тем, который я ищу.
Может ли кто-нибудь дать мне свет здесь? Может быть, мне нужно установить пакет разработчика?
Спасибо!
нельсон
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", который описывает вашу грамматику. В другом ".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), вам нужно написать их.
Я надеюсь, это поможет вам.
Beco