Antlr4 for Python解析查询语句时如何区分子节点的列名、运算符与值
解决方法
Antlr生成的词法分析器类settingsLexer已经为你定义的所有词法规则生成了对应的类型常量,你只需要判断终端节点的Token类型即可区分三类节点。
具体修改步骤如下:
- 先导入终端节点类:
from antlr4.tree.Tree import TerminalNode
- 调整遍历语法树子节点的逻辑,匹配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,提问作者Альберт Александров
相关产品推荐
相关产品推荐

