Я пытаюсь написать собственный анализатор 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 ++.