这是一个小演示,如何使用 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;
}
生成文件
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-box 上):
token: 'foo'
token: ' '
token: '42'
token: ' '
token: 'BAR'
token: ' '
token: '3.141592'
token: '
'
不用说,antlr-3.3.jar 需要与其他 .g 和 .c 文件位于同一目录中,并且 C 编译器需要在您的系统上找到 antlr3c。
另外,在复制粘贴 Makefile 时,请务必保留行首的缩进制表符。