You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在ANTLR 3(C目标语言)中获取解析结果并判断解析状态

在ANTLR 3 C目标中实现解析成功/失败的提示输出

要实现解析成功或失败的差异化提示,你需要借助ANTLR3解析器内置的错误计数机制,同时可以捕获解析生成的语法树节点。具体修改如下:

核心修改点

  • 调用解析器入口方法时,接收返回值以获取解析树
  • 通过解析器的错误计数器判断解析是否出错
  • 根据错误状态输出对应提示,可选打印解析树的基础信息

修改后的完整代码

#include <stdio.h>
// 确保包含你的ANTLR3生成的头文件,比如X509Parser.h

int main(int argc, char *argv[]) {

    pANTLR3_UINT8 fName = (pANTLR3_UINT8)"./example";
    pANTLR3_INPUT_STREAM input = antlr3FileStreamNew(fName, ANTLR3_ENC_8BIT);

    pX509Lexer lxr = X509LexerNew(input);
    pANTLR3_COMMON_TOKEN_STREAM tokens = antlr3CommonTokenStreamSourceNew(ANTLR3_SIZE_HINT, TOKENSOURCE(lxr));
    //print_lexer_result(tokens);
    
    pX509Parser psr = X509ParserNew(tokens);
    // 接收解析方法的返回值,获取解析树
    pX509Parser_prog_return parse_result = psr->prog(psr);

    // 检查解析器的错误计数,判断是否解析失败
    if (psr->pParser->rec->state->errorCount > 0) {
        printf("[ FAIL ] Parsing failed! Found %d errors.\n", psr->pParser->rec->state->errorCount);
    } else {
        printf("[  OK  ] Successfully parsed!\n");
        // 可选:打印解析树的节点数(如果需要查看解析树基础信息)
        if (parse_result.tree != NULL) {
            printf("Parse tree node count: %d\n", (int)parse_result.tree->getChildCount(parse_result.tree));
        }
    }

    // 释放资源:注意先释放解析树(如果存在)
    if (parse_result.tree != NULL) {
        parse_result.tree->free(parse_result.tree);
    }
    lxr    -> free(lxr);
    tokens -> free(tokens);
    psr    -> free(psr);
    input  -> close(input);

    return psr->pParser->rec->state->errorCount > 0 ? 1 : 0;
}

关键说明

  1. 错误计数检查:psr->pParser->rec->state->errorCount 是ANTLR3解析器内置的错误计数器,只要解析过程中出现语法错误,这个值就会大于0。
  2. 解析树获取:ANTLR3的解析入口方法(比如这里的prog)会返回包含解析树的结构体,通过parse_result.tree可以访问生成的语法树节点,你可以根据需求扩展对解析树的遍历或打印逻辑。
  3. 资源释放:新增了解析树的释放操作,避免内存泄漏;同时程序返回值根据解析结果设置为0(成功)或1(失败),符合常规命令行程序的返回值约定。

内容的提问来源于stack exchange,提问作者Simone

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 17:03:20