ต่อไปนี้เป็นตัวอย่างเล็กๆ น้อยๆ เกี่ยวกับวิธีการใช้ตัวแยกวิเคราะห์ 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
: .
;
input.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;
}
เมคไฟล์
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
Makefile
จะไม่ช่วยคุณมากกับ ANTLR ฉันคิดว่าคุณต้องใช้ Bison ตัวแยกวิเคราะห์ไวยากรณ์ (ดูเพิ่มเติมใน wiki) ดังนั้นMakefile
ของคุณอาจดูเหมือนมีคนพูดถึงที่นี่ - person dma_k   schedule 17.02.2012