2015-02-24 2 views
0

Я разрабатываю проект, который должен разработать компилятор (фактически синтаксический анализатор), помимо основного проекта. Я использую Qt 5.3 и Windows (но результат почти такой же на Ubuntu 14.04).
У меня есть опыт использования гибких и бизонов, однако на этот раз, я разработал сканер, а затем Parser. Я тщательно тестирую сканер и удостоверяюсь, что это ошибка. но по мере добавления парсера в проект возникло много ошибок (например, неопределенная ссылка на yylex(), однако я объявила extern int yylex(), и я не могу использовать библиотеку, как я упомянул), а после этого, когда я устраняю парсер, некоторые функции, которые работали до этого, теперь не работает! например, теперь я не могу использовать #include <QDebug>!
Когда я использую этот файл заголовка, компилятор говорит, что в этой библиотеке много ошибок (77 ошибок)! Я смутился, уже два дня я работаю над этим, и прогресса нет.
Я использовал «Custom Build Steps», и я установил путь к ${sourceDir}. Кроме того, я добавил lex.yy.c, y.tab.c в SOURCES и y.tab.h в HEADERS в .pro файл.
Я узнал, как использовать flex и зубров через here в первый раз. и для этих ошибок я прочитал следующее:
Undefined Reference to yylex()
How to Integrate Flex and Bison
и некоторые другие ссылки ...Невозможно использовать Flex и Bison Together на Qt

программы
+0

Может быть «extern» C «int yylex();' поможет? – Matt

+0

@ user4419802: Не работает! – bahrami307

+0

Что такое первая ошибка? – Matt

ответ

1

Qt находятся в C++, а не С.

Если у вас есть не слишком древние версии flex и bison, у вас не возникнет проблем с компиляцией их сгенерированного кода с использованием C++, но вам нужно сообщить компилятору, что они должны быть скомпилированы на C++. (С помощью комбинации C и C++, конечно, возможно, но это требует некоторой осторожности.)

Использование GCC, должно быть достаточно, чтобы убедиться, что имена файлов, сгенерированных зубров и прогибается имеют .cc расширение вместо .c , которую вы можете использовать, используя опцию командной строки -o. (Это настоятельно рекомендуется в любом случае, потому что он позволяет вам выбирать более значимые имена файлов, а затем y.tab.c и lex.yy.c.) Это требует некоторых настроек вашего Makefile. (Вы также можете использовать %output "filename" директиву в bison и %option outfile="filename" в flex, но вам все равно нужно настроить зависимости в вашем файле Makefile.)

Другой, менее рекомендуется, вариант заключается в использовании опции -x c++ командной строки НКА.

Без дополнительной информации о наборе инструментов, который вы используете в Windows, нелегко дать больше советов, особенно для меня (поскольку у меня есть 0 опыт работы с инструментами Windows). Но ключ должен гарантировать, что оба файла скомпилированы как C++.

Из-за того, что вы пытаетесь создать заголовок Qt, похоже, что компиляция сканера и синтаксического анализа как программы C не является практичной. Но если я не понимаю ваш проект, и ни сканер, ни парсер не требуют C++, тогда вы можете это сделать; вам нужно объявить extern "C" int yylex(); в блоке перевода C++, который вызывает yylex. (Не помещайте это объявление в файл scanner.l, это не сработает, если вы компилируете с C.)

0

C++ установка flex/bison сложна.Проверьте этот пример проекта:

https://github.com/ezaquarii/bison-flex-cpp-example

Это полная, работа C++ Flex и Bison "переводчик", инкапсулированный в классе. Фактически я использовал его несколько раз с Qt 4.8.