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
Makefile
tidak akan banyak membantu Anda dengan ANTLR. Sebaliknya saya kira Anda perlu menggunakan parser tata bahasa Bison (lihat juga di wiki). JadiMakefile
Anda mungkin terlihat seperti yang disebutkan di sini. - person dma_k   schedule 17.02.2012