компиляция файла с использованием грамматики ANTLR

Я писал грамматику antlr, чтобы в конечном итоге использовать ее как часть компилятора для программ на маленьком C. Для извлечения кода я изначально использовал java-программы, которые вызывают грамматику и содержат входную строку (код smallC), и это сработало.

К сожалению, мне только что сказали, что мы должны сделать это, используя make-файл, который может вызывать грамматику и программу .c smallC и создавать .exe. Крайний срок для этого очень скоро, и мне просто интересно, насколько это возможно, и если у кого-нибудь есть какие-либо советы, как это сделать, я действительно не работал с make-файлами раньше.

Спасибо.


person djcmm476    schedule 16.02.2012    source источник
comment
Какой вопрос вы задаете здесь? Мне непонятно, в чем вам нужна помощь.   -  person kittylyst    schedule 16.02.2012
comment
Ну, я даже не уверен, с чего начать, знаете ли вы какие-нибудь хорошие учебные пособия или справочные материалы по написанию make-файлов, которые работают с java и antlr.   -  person djcmm476    schedule 16.02.2012
comment
Можете ли вы описать желаемый рабочий процесс более подробно? Предположим, у меня есть новая программа на SmallC. Что мне сделать с ним в вашем мире, чтобы заставить его работать?   -  person kittylyst    schedule 16.02.2012
comment
Извините, я немного сумбурно описываю здесь. Спасибо за терпение. Итак, у меня есть файл antlr, грамматика .g, в которой определены все мои правила парсера/лексера и т. д. У меня также есть java-файл, который в настоящее время принимает входную строку и выводит дерево (хотя я надеюсь изменить его, чтобы вытащить текст из файла .c), и я хочу создать make-файл, который будет запускать это, или сделать исполняемый файл что будет.   -  person djcmm476    schedule 16.02.2012
comment
Makefile не сильно поможет вам с ANTLR. Вместо этого, я полагаю, вам нужно использовать анализатор грамматики Bison (см. также wiki). Таким образом, ваш Makefile может выглядеть как упомянутый здесь.   -  person dma_k    schedule 17.02.2012


Ответы (1)


Вот небольшая демонстрация того, как использовать парсер, сгенерированный ANTLR (C), для компиляции и запуска с использованием make:

Вам понадобятся следующие 4 файла:

T.g

grammar T;

options {
  language=C;
}

parse
  :  (t=. {printf("token: '\%s'\n", $t.text->chars);})+ EOF
  ;

NUMBER
  :  ('0'..'9')+ ('.' ('0'..'9')+)?
  ;

WORD
  :  ('a'..'z' | 'A'..'Z')+
  ;

OTHER
  :  .
  ;

ввод.txt

foo 42 BAR 3.141592

main.c

#include "TLexer.h"
#include "TParser.h"

int main(int argc, char *argv[])
{
  pANTLR3_UINT8 fileName = (pANTLR3_UINT8)"input.txt";
  pANTLR3_INPUT_STREAM input = antlr3AsciiFileStreamNew(fileName);

  if(input == NULL)
  {
    fprintf(stderr, "Failed to open file %s\n", (char *)fileName);
    exit(1);
  }

  pTLexer lexer = TLexerNew(input);

  if(lexer == NULL)
  {
    fprintf(stderr, "Unable to create the lexer due to malloc() failure1\n");
    exit(1);
  }

  pANTLR3_COMMON_TOKEN_STREAM tstream = antlr3CommonTokenStreamSourceNew(ANTLR3_SIZE_HINT, TOKENSOURCE(lexer));

  if(tstream == NULL)
  {
    fprintf(stderr, "Out of memory trying to allocate token stream\n");
    exit(1);
  }

  pTParser parser = TParserNew(tstream);

  if(parser == NULL)
  {
    fprintf(stderr, "Out of memory trying to allocate parser\n");
    exit(ANTLR3_ERR_NOMEM);
  }

  parser->parse(parser);

  parser->free(parser);   parser = NULL;
  tstream->free(tstream); tstream = NULL;
  lexer->free(lexer);     lexer = NULL;
  input->close(input);    input = NULL;

  return 0;
}

Makefile

run: T.g main.c
    java -cp antlr-3.3.jar org.antlr.Tool T.g
    gcc -Wall main.c TLexer.c TParser.c -l antlr3c -o main
    ./main

Если вы сейчас запустите make, будет напечатано следующее (по крайней мере, на моем Ubuntu-боксе):

token: 'foo'
token: ' '
token: '42'
token: ' '
token: 'BAR'
token: ' '
token: '3.141592'
token: '
'

Излишне говорить, что antlr-3.3.jar должен находиться в том же каталоге, что и другие файлы .g и .c, и компилятор C должен найти antlr3c в вашей системе.

Кроме того, при копировании и вставке Makefile не забудьте сохранить табуляцию с отступом в начале строк.

person Bart Kiers    schedule 17.02.2012
comment
comment
@dma_k, да, есть довольно много целей, для которых ANTLR может создать парсер (см.: antlr.org/wiki/display/ANTLR3/Code+Generation+Targets ). Не все из них одинаково хороши, но некоторые из них хороши (один из которых — цель C). - person Bart Kiers; 18.02.2012
comment
Это было действительно полезно, большое спасибо. Я отметил ваш ответ как правильный, пусть он поможет будущим поколениям создавать make-файлы для странных программ. - person djcmm476; 24.02.2012