如何仅使用ANTLR3 lexer,而不使用解析器?
我只需要在ANTLR3中使用lexer,不需要解析器。我怎么做?我使用以下代码(在main.c中),我在互联网上找到了这些代码如何仅使用ANTLR3 lexer,而不使用解析器?,antlr,antlr3,lexer,parser-generator,Antlr,Antlr3,Lexer,Parser Generator,我只需要在ANTLR3中使用lexer,不需要解析器。我怎么做?我使用以下代码(在main.c中),我在互联网上找到了这些代码 #include <CLexer.h> #include <CParser.h> int ANTLR3_CDECL main (int argc, char *argv[]) { pANTLR3_UINT8 fileName; pANTLR3_INPUT_STREAM i
#include <CLexer.h>
#include <CParser.h>
int ANTLR3_CDECL
main (int argc, char *argv[])
{
pANTLR3_UINT8 fileName;
pANTLR3_INPUT_STREAM inputStream;
pCLexer cLexer;
pANTLR3_COMMON_TOKEN_STREAM tokenStream;
pCParser cParser;
// Имя входного файла по умолчанию - "input", но
// его можно задать аргументом программы
//
if (argc < 2 || argv[1] == NULL)
{
fileName = (pANTLR3_UINT8) "./input";
}
else
{
fileName = (pANTLR3_UINT8) argv[1];
}
// Открываем входной поток, связанный с этим файлом
//
inputStream = antlr3AsciiFileStreamNew(fileName);
if ( inputStream == NULL)
{
// Аварийный выход (файл не открывается)
//
fprintf(stderr, "Failed to open file %s\n", (char *) fileName);
exit(1);
}
// Создаём лексер, связанный с открытым потоком
//
cLexer = CLexerNew(inputStream);
if ( cLexer == NULL )
{
// Аварийный выход (закончилась память, лол)
//
fprintf(stderr, "Unable to create the lexer due to malloc() failure1\n");
exit(1);
}
// Получаем поток токенов из входных данных
//
tokenStream = antlr3CommonTokenStreamSourceNew(ANTLR3_SIZE_HINT,
TOKENSOURCE(cLexer));
if (tokenStream == NULL)
{
// Аварийный выход (закончилась память)
//
fprintf(stderr, "Out of memory trying to allocate token stream\n");
exit(1);
}
// Создаём парсер, связанный с потоком токенов
//
cParser = CParserNew(tokenStream);
if (cParser == NULL)
{
// Аварийный выход (закончилась память, хотя, мне кажется,
// что здесь более вероятны другие причины ошибки)
//
fprintf(stderr, "Out of memory trying to allocate parser\n");
exit(ANTLR3_ERR_NOMEM);
}
// Не знаю
//
cParser->translation_unit(cParser);
// Уничтожаем созданные "объекты" в том порядке, в котором их создавали
//
cParser ->free(cParser);
cParser = NULL;
tokenStream ->free(tokenStream);
tokenStream = NULL;
cLexer ->free (cLexer);
cLexer = NULL;
inputStream ->close (inputStream);
inputStream = NULL;
return 0;
}
#包括
#包括
int ANTLR3_CDECL
main(int argc,char*argv[])
{
pANTLR3_UINT8文件名;
pANTLR3\u输入\u流输入流;
pCLexer-cLexer;
pANTLR3\u公共\u令牌流\u令牌流;
pcrser;
//“输入”一词
// его можно задать аргументом программы
//
if(argc<2 | | argv[1]==NULL)
{
文件名=(pANTLR3_UINT8)“./input”;
}
其他的
{
fileName=(pANTLR3_UINT8)argv[1];
}
// Открываем входной поток, связанный с этим файлом
//
inputStream=antlr3AsciiFileStreamNew(文件名);
如果(inputStream==NULL)
{
// Аварийный выход (файл не открывается)
//
fprintf(stderr,“无法打开文件%s\n”,(char*)文件名);
出口(1);
}
// Создаём лексер, связанный с открытым потоком
//
cLexer=CLexerNew(inputStream);
if(cLexer==NULL)
{
// Аварийный выход (закончилась память, лол)
//
fprintf(stderr,“由于malloc()故障,无法创建lexer 1\n”);
出口(1);
}
// Получаем поток токенов из входных данных
//
tokenStream=antlr3CommonTokenStreamSourceNew(ANTLR3\u SIZE\u提示,
令牌源(cLexer));
if(tokenStream==NULL)
{
// Аварийный выход (закончилась память)
//
fprintf(stderr,“试图分配令牌流的内存不足\n”);
出口(1);
}
// Создаём парсер, связанный с потоком токенов
//
cParser=CParserNew(令牌流);
if(cParser==NULL)
{
// Аварийный выход (закончилась память, хотя, мне кажется,
// что здесь более вероятны другие причины ошибки)
//
fprintf(stderr,“试图分配解析器的内存不足”\n);
出口(ANTLR3错误名称);
}
// Не знаю
//
cParser->翻译单元(cParser);
// Уничтожаем созданные "объекты" в том порядке, в котором их создавали
//
cParser->free(cParser);
cParser=NULL;
令牌流->自由(令牌流);
tokenStream=NULL;
cLexer->free(cLexer);
cLexer=NULL;
输入流->关闭(输入流);
inputStream=NULL;
返回0;
}
但看起来它也使用了解析器,因为当我尝试使用它时,控制台中会出现大量的解析错误。对令牌流“object”使用getTokens()来获取令牌的ANTLR向量。然后打印向量的内容
//This runs fillBuffer() which is the function that runs the lexer to completion
pANTLR3_VECTOR tList = tokenStream->getTokens(tokenStream);
pANTLR3_COMMON_TOKEN token = tList->get(tList,0);
当您从
cLexer=CLexerNew(inputStream)获取cLexer
时代码>,你想要的东西就在里面。我不知道你还想知道什么。我有语法文件(由我轻松编辑),这里就是我所需要的,就是在输出控制台中获取令牌列表