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

Antlr4 for Python解析查询语句时如何区分子节点的列名、运算符与值

解决方法

Antlr生成的词法分析器类settingsLexer已经为你定义的所有词法规则生成了对应的类型常量,你只需要判断终端节点的Token类型即可区分三类节点。

具体修改步骤如下:

  1. 先导入终端节点类:
from antlr4.tree.Tree import TerminalNode
  1. 调整遍历语法树子节点的逻辑,匹配Token类型:
for child in tree.getChildren():
    # 跳过非终端节点
    if not isinstance(child, TerminalNode):
        continue
    token_type = child.getSymbol().type
    text = child.getText()

    if token_type == settingsLexer.COLUMN:
        column = text
    elif token_type == settingsLexer.OPERATOR:
        operator = text
    # 匹配值类型(SETTING或SCALAR)
    elif token_type in (settingsLexer.SETTING, settingsLexer.SCALAR):
        value = text
        # 执行原有的取值逻辑
        if match := regex.match(text):
            setting_name = match.group('setting_name')
            print(f'应从名为`{setting_name}`的配置中取值')
            min_total_sales = settings[setting_name]
        else:
            print(f'获取到简单标量值:{text}')
            min_total_sales = int(text)

补充简化方案

因为你的query语法规则结构是固定的,子节点顺序永远是「列名→运算符→值」,你也可以直接按索引取值,代码更简洁:

# 先过滤出所有终端节点
terminal_children = [c for c in tree.getChildren() if isinstance(c, TerminalNode)]
column = terminal_children[0].getText()
operator = terminal_children[1].getText()
value = terminal_children[2].getText()

内容的提问来源于stack exchange,提问作者Альберт Александров

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 16:15:02