【问题标题】:How to use ANTLR3 lexer only, without parser?如何在没有解析器的情况下仅使用 ANTLR3 词法分析器?
【发布时间】:2012-10-16 06:09:07
【问题描述】:

我只需要在 ANTLR3 中使用词法分析器,我不需要解析器。我该怎么做 ?我使用以下代码(在 main.c 中),这是我在互联网上找到的。

    #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;
}

但看起来它也使用了解析器,因为当我尝试使用它时,我在控制台中遇到了大量的解析错误。

【问题讨论】:

  • 当你从cLexer = CLexerNew(inputStream); 得到cLexer 时,你想要的就在那里。我不知道你还想知道什么。
  • 在这里操作。我有语法文件(由我轻微编辑),这是rghost.ru/40968674
  • 我只需要在输出控制台中获取令牌列表

标签: antlr antlr3 lexer parser-generator


【解决方案1】:

在 tokenStream '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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-31
    相关资源
    最近更新 更多