我一直在编写一个antlr语法,最终被用作smallC程序编译器的一部分。为了提取代码,我最初使用的java程序调用语法并包含输入字符串(smallC代码),这已经奏效。
不幸的是,我刚刚被告知我们必须使用makefile来执行此操作,该makefile可以调用语法和.c smallC程序并生成.exe。这个截止日期很快,我只是想知道这是多么可能,如果有人有任何建议去做,我以前没有真正做过任何关于makefile的工作。
感谢。
答案 0 :(得分:3)
这是一个小型演示如何使用ANTLR生成的(C)解析器来编译和运行make
:
您需要以下4个文件:
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
: .
;
foo 42 BAR 3.141592
#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
时,请务必在行的开头保留缩进的标签。