mengkompilasi file menggunakan tata bahasa ANTLR

Saya telah menulis tata bahasa antlr untuk akhirnya digunakan sebagai bagian dari kompiler untuk program smallC. Untuk menarik kode saya awalnya menggunakan program Java yang memanggil tata bahasa dan berisi string input (kode smallC), dan ini berhasil.

Sayangnya, saya baru saja diberitahu bahwa kita harus melakukan ini menggunakan makefile yang dapat memanggil tata bahasa dan program .c smallC dan menghasilkan .exe. Batas waktu untuk ini akan segera tiba dan saya hanya ingin tahu seberapa mungkin hal ini terjadi dan jika ada yang punya saran untuk melakukannya, saya belum pernah melakukan pekerjaan apa pun dengan makefile sebelumnya.

Terima kasih.


person djcmm476    schedule 16.02.2012    source sumber
comment
Apa pertanyaan yang Anda tanyakan di sini? Tidak jelas bagi saya bantuan apa yang Anda perlukan.   -  person kittylyst    schedule 16.02.2012
comment
Terlebih lagi saya bahkan tidak yakin harus mulai dari mana, tahukah Anda tutorial atau bahan referensi yang bagus untuk menulis makefile yang bekerja dengan java dan antlr.   -  person djcmm476    schedule 16.02.2012
comment
Bisakah Anda menjelaskan alur kerja yang diinginkan secara lebih rinci? Misalkan saya punya program SmallC baru. Apa yang harus saya lakukan di dunia Anda agar dapat berjalan?   -  person kittylyst    schedule 16.02.2012
comment
Maaf, saya agak sampah dengan uraian saya di sini. Terima kasih telah bersabar. Oke, jadi saya punya file antlr, tata bahasa .g tempat semua aturan parser/lexer, dll didefinisikan. Saya juga memiliki file Java yang saat ini mengambil string input dan menampilkan pohon (meskipun saya berharap untuk memodifikasinya untuk menarik teks dari file .c) dan saya ingin membuat makefile yang akan menjalankan ini, atau membuat file yang dapat dieksekusi itu akan.   -  person djcmm476    schedule 16.02.2012
comment
Makefile tidak akan banyak membantu Anda dengan ANTLR. Sebaliknya saya kira Anda perlu menggunakan parser tata bahasa Bison (lihat juga di wiki). Jadi Makefile Anda mungkin terlihat seperti yang disebutkan di sini.   -  person dma_k    schedule 17.02.2012


Jawaban (1)


Berikut demo kecil cara menggunakan parser yang dihasilkan ANTLR (C) untuk dikompilasi dan dijalankan menggunakan make:

Anda memerlukan 4 file berikut:

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
  :  .
  ;

masukan.txt

foo 42 BAR 3.141592

utama.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;
}

file make

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

Jika sekarang Anda menjalankan make, yang berikut ini akan dicetak (setidaknya di kotak Ubuntu saya):

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

Tak perlu dikatakan lagi, antlr-3.3.jar harus berada di direktori yang sama dengan file .g dan .c lainnya dan kompiler C perlu menemukan antlr3c di sistem Anda.

Selain itu, saat menyalin-menempelkan Makefile, pastikan untuk mempertahankan tab yang menjorok ke dalam di awal baris.

person Bart Kiers    schedule 17.02.2012
comment
comment
@dma_k, ya, ada beberapa target yang dapat dihasilkan parser oleh ANTLR (lihat: antlr.org/wiki/display/ANTLR3/Code+Generation+Targets ). Tidak semuanya sama bagusnya, tapi cukup banyak yang bagus (salah satunya target C). - person Bart Kiers; 18.02.2012
comment
Itu sangat membantu, terima kasih banyak. Saya telah menandai jawaban Anda sebagai jawaban yang benar, semoga dapat memandu generasi mendatang dalam membuat makefile untuk program aneh. - person djcmm476; 24.02.2012