Как я могу успешно связать Flex, Bison и Node.js в собственном аддоне Node? - PullRequest
2 голосов
/ 21 мая 2011

Я пытаюсь написать собственный анализатор Node.js, используя Flex / Bison.Аддон состоит из трех частей: лексера, анализатора и интерфейса node / v8.В начале лексер и парсер работали хорошо (я использовал g ++ для компиляции лексера / парсера и включил необходимые функции лексера, такие как: http://tldp.org/HOWTO/Lex-YACC-HOWTO-5.html). Когда я добавил секцию node / v8 в микс, я закончилдо получения ошибки отсутствующего символа для функции, определенной в коде лексера.

Вот обзор структуры файла:

File A: Lexer file, automatically generated by flex from the lexer rules I wrote.

File B: The parser file, includes the extern "C" { [lexer functions] } and 
        a function called parse(std::string). parse() calls some yy_functions, 
        which are defined in the lexer, and returns a c++ data structure 
        representing the parsed data.

File C: This is the node/v8 part. There is a header file with the prototype for 
        B's parse() function. When JS calls a certain function, the data is 
        converted to a c++ string and passed to the parse() function in File B.

Когда я запускаю простой тест для анализа строки JS,Я получаю сообщение об ошибке:

node: symbol lookup error: /home/monty/projects/flex_bison/GetObj_Request_Parser/build/default/GetObjParser.node: undefined symbol: yy_scan_string

Примечание. Я использую node-waf для создания аддона, и я переименовал файлы, сгенерированные flex и bison из [FILE].c к [FILE] .cc, чтобы скрипт сборки их забрал.

Если вы хотите увидеть какой-то код, вы можете найти все это здесь: https://github.com/IDX-io/GetObj_Request_Parser (посмотрите в src /buildstuffs dir).

File A = src/buildstuffs/lex.yy.c[c]
File B = src/buildstuffs/geto.tab.c[c]
File C = src/buildstuffs/GetObjParser.cc
Test = test.js

Спасибо!

[EDIT] Вместо того, чтобы использовать два разных компилятора и возиться со сценарием сборки node-waf (мое решение), возможно, можно использовать flex ++ и bison ++ для генерации C ++.

Ответы [ 2 ]

1 голос
/ 21 мая 2011

Избавьтесь от extern "C" в верхней части вашего geto.y файла.Функции flex не экспортируются с помощью C-linkage.

1 голос
/ 21 мая 2011

переименование файлов в .cc, как правило, приводит к тому, что правила сборки по умолчанию создаются с использованием c ++ вместо c. Это может означать, что связь с функциями в файле lex.yy.c неверна. Я думаю, что вам нужно найти другой способ заставить систему сборки узлов распознавать ваши файлы .c и правильно собирать их с помощью c, а не c ++

...