pyparsing setParseAction未传递令牌

2024-06-02 11:48:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我对pyparsing和Python非常陌生,所以这是一个警告,我可能做了一些非常错误的事情。在

我要做的是构建一个SQL解析器,并用节点构建树,然后我可以遍历这些节点。在

我试图从yacc/bison grammer文件中复制这种东西:

| scalar_exp '^' scalar_exp   
         { $$ = new QgsSearchTreeNode(QgsSearchTreeNode::opPOW,  $1, $3);
           joinTmpNodes($$,$1,$3); }

这是我在Python中的代码:

^{pr2}$

注意:它是select的精简版_分析器.py保罗·麦奎尔

我想我必须使用setParseAction,但是每次我调用的方法中的标记总是没有。我得到了完整的字符串和位置,但没有令牌。在

调用setParseAction来复制yacc/bison逻辑的最佳位置在哪里?在


Tags: 文件解析器警告sql节点错误pyparsing事情
1条回答
网友
1楼 · 发布于 2024-06-02 11:48:27

OperatorReceidence操作列表中的第一个条目应该是右关联的,而不是左的。在进行了更改(并启用了packrat解析)之后,这个解析器开始为我工作。在

但是对于构建语法树,我将让pyparsing为您构建树。将解析操作附加到不同的语法元素,这些元素返回将在setObject中创建的类的实例。比如:

class ExpressionNode(object):
    def __init__(self, tokens):
        self.tokens = tokens

    def __repr__(self):
        return "%s:\n%s" % (self.__class__.__name__, self.tokens.dump(indent='  '))

    def __getattr__(self, attr):
        return getattr(self.tokens, attr)

class SelectNode(ExpressionNode): pass

select_stmt.setParseAction(SelectNode)
stmtobj = select_stmt.parseString("SELECT * FROM B")[0]
print stmtobj.columns

相关问题 更多 >