Составление ANTLR 3 грамматики в C - PullRequest
1 голос
/ 18 ноября 2009

Я пытался изучить ANTLR и заставить его работать с выходным кодом C, используя этот учебник (также упоминаемый в этом вопросе). Я успешно получил ANTLR для генерации лексера и парсера в качестве источника C, но не могу заставить их скомпилировать с помощью gcc на Mac OS X Snow Leopard (i686-apple-darwin10-gcc-4.2.1). Ниже приведен результат, когда я пытаюсь скомпилировать «SimpleCalcLexer.c».

dyn-72-33-132-199:Desktop bf$ gcc -o lexer SimpleCalcLexer.c
Undefined symbols:
  "_main", referenced from:
      start in crt1.10.6.o
  "_antlr3LexerNewStream", referenced from:
      _SimpleCalcLexerNewSSD in ccjXa6NU.o
ld: symbol(s) not found
collect2: ld returned 1 exit status

Файл SimpleCalcLexer.c нигде не ссылается на «основной» (и при этом он не определен), но синтаксический анализатор определяет , поэтому я попытался скомпилировать это:

dyn-72-33-132-199:Desktop bf$ gcc -o parser SimpleCalcParser.c
Undefined symbols:
  "_antlr3CommonTokenStreamSourceNew", referenced from:
      _main in ccn8ZVhk.o
  "_antlr3ParserNewStream", referenced from:
      _SimpleCalcParserNewSSD in ccn8ZVhk.o
  "_SimpleCalcLexerNew", referenced from:
      _main in ccn8ZVhk.o
  "_antlr3AsciiFileStreamNew", referenced from:
      _main in ccn8ZVhk.o
ld: symbol(s) not found
collect2: ld returned 1 exit status

Итак, несколько вопросов:
1) Что я делаю не так? Я почти уверен, что библиотеки найдены, так как в коде находятся другие функции и определения antlr. Я неправильно называю GCC? (Я никогда не компилировал ничего такого сложного в командной строке.)
2) Что такое ccn8ZVhk.o? Я могу сказать, что это файл объектного кода, но я не могу найти его в своей системе (locate и mdfind).

Ответы [ 2 ]

4 голосов
/ 03 декабря 2009

Вам необходимо скомпилировать лексер и парсер в один и тот же исполняемый файл; они работают вместе, чтобы создать единую программу. Попробуйте это:

gcc -o lexer SimpleCalcLexer.c SimpleCalcParser.c -lantlr3c

Эта командная строка скомпилирует лексер и анализатор и затем свяжет результат с библиотекой ANTLR (часть "-lantlr3c").

Объектный файл ccn8ZVhk.o является частью библиотеки времени выполнения и является тем, что фактически вызывает main (). Не содержит обслуживаемых пользователем частей.

0 голосов
/ 07 декабря 2009

Если вы скомпилируете несколько раз, вы увидите, что имена файлов объектного кода меняются каждый раз, поэтому я предполагаю, что они являются временными объектными файлами, используемыми до того, как конечная цель компилируется и связывается. Я столкнулся с той же проблемой и попытался указать архитектуру 386 и 686. Я пытаюсь скомпилировать вывод этого файла грамматики Python3 . CajunLuke, можете ли вы опубликовать точную команду, которую вы использовали для компиляции, когда она работала? Вот пример того, что я сделал:

WOPR:plex pokstad$ gcc -arch i686 -o lexer python3Lexer.c python3Parser.c -lantlr3c
Undefined symbols:
"_main", referenced from:
  start in crt1.10.6.o
"_python3Lexer_syntetizeEmptyString", referenced from:
  _mLEADING_WS in ccGDusga.o
"_python3Lexer_createLexerToken", referenced from:
  _mCONTINUED_LINE in ccGDusga.o
  _mLEADING_WS in ccGDusga.o
"_python3Lexer_initLexer", referenced from:
  _python3LexerNewSSD in ccGDusga.o
ld: symbol(s) not found
collect2: ld returned 1 exit status

Кроме того, вы компилировали среду выполнения ANTLR3C не так, как обычные команды "configure; make; make install"? Я попытался скомпилировать, используя 64-битную опцию, и у меня возникла та же проблема.

...