使用ANTLR语法编译文件

时间:2012-02-16 11:00:06

标签: java makefile antlr

我一直在编写一个antlr语法,最终被用作smallC程序编译器的一部分。为了提取代码,我最初使用的java程序调用语法并包含输入字符串(smallC代码),这已经奏效。

不幸的是,我刚刚被告知我们必须使用makefile来执行此操作,该makefile可以调用语法和.c smallC程序并生成.exe。这个截止日期很快,我只是想知道这是多么可能,如果有人有任何建议去做,我以前没有真正做过任何关于makefile的工作。

感谢。

1 个答案:

答案 0 :(得分:3)

这是一个小型演示如何使用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时,请务必在行的开头保留缩进的标签。