Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python pyparsing setParseAction未传递令牌_Python_Parsing_Pyparsing - Fatal编程技术网

Python pyparsing setParseAction未传递令牌

Python pyparsing setParseAction未传递令牌,python,parsing,pyparsing,Python,Parsing,Pyparsing,我对pyparsing和Python非常陌生,所以这是一个警告,我可能做了一些非常错误的事情 我试图做的是构建一个SQL解析器,并用我可以遍历的节点构建一个树 我试图从yacc/bison语法文件中复制这种东西: | scalar_exp '^' scalar_exp { $$ = new QgsSearchTreeNode(QgsSearchTreeNode::opPOW, $1, $3); joinTmpNodes($$,$1,$3); }

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

我试图做的是构建一个SQL解析器,并用我可以遍历的节点构建一个树

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

| scalar_exp '^' scalar_exp   
         { $$ = new QgsSearchTreeNode(QgsSearchTreeNode::opPOW,  $1, $3);
           joinTmpNodes($$,$1,$3); }
这是我用Python编写的代码:

LPAR = Suppress('(')
RPAR = Suppress(')')
COMMA = Suppress(',')

AND = CaselessKeyword('AND')
ASC = CaselessKeyword('ASC')
DESC = CaselessKeyword('DESC')
ON = CaselessKeyword('ON')
USING = CaselessKeyword("USING")
INNER = CaselessKeyword("INNER")
JOIN = CaselessKeyword("JOIN")
AS = CaselessKeyword("AS")
NOT = CaselessKeyword("NOT")
SELECT = CaselessKeyword("SELECT")
FROM = CaselessKeyword("FROM")
WHERE = CaselessKeyword("WHERE")
GROUP = CaselessKeyword("GROUP")
BY = CaselessKeyword("BY")
ORDER = CaselessKeyword("ORDER")
LIMIT = CaselessKeyword("LIMIT")
BETWEEN = CaselessKeyword("BETWEEN")

UNARY = 1
BINARY = 2
TERNARY = 3

keyword = MatchFirst(( ASC, DESC, ON, USING, INNER,
 JOIN, AS, NOT, SELECT, FROM, WHERE, GROUP, BY,
 ORDER, BY, LIMIT,BETWEEN))

identifier = ~keyword + Word(alphas, alphanums+"_")
collation_name = identifier.copy()
column_name = Suppress('[') + ~keyword + Word(alphas, alphanums+"_") + Suppress(']')
column_alias = identifier.copy()
table_name = identifier.copy()
table_alias = identifier.copy()
index_name = identifier.copy()
function_name = identifier.copy()
parameter_name = identifier.copy()

expr = Forward().setName("expression")
select_stmt = Forward().setName("select statement")

integer = Regex(r"[+-]?\d+")
numeric_literal = Regex(r"\d+(\.\d*)?([eE][+-]?\d+)?")
string_literal = QuotedString("'")
literal_value = ( numeric_literal | string_literal)

expr_term = (
    function_name + LPAR + Optional(delimitedList(expr)) + RPAR |
    literal_value |
    identifier |
    column_name
    )

expr << operatorPrecedence(expr_term,
    [
    (oneOf('- + ~') | NOT, UNARY, opAssoc.LEFT, setObject),
    ('||', BINARY, opAssoc.LEFT),
    (oneOf('* / %'), BINARY, opAssoc.LEFT,setObject),
    (oneOf('+ -'), BINARY, opAssoc.LEFT),
    (oneOf('<< >> & |'), BINARY, opAssoc.LEFT),
    (oneOf('< <= > >='), BINARY, opAssoc.LEFT),
    (oneOf('= == != <>') , BINARY, opAssoc.LEFT),
    ('||', BINARY, opAssoc.LEFT),
    ((BETWEEN,AND), TERNARY, opAssoc.LEFT),
    ])

ordering_term = expr + Optional(ASC | DESC)

join_constraint = ON + expr('join_expression')

join_op = COMMA | (INNER + JOIN)

join_source = Forward()
single_source = ( table_name("table") +
                    Optional(Optional(AS) + table_alias("table_alias")))

join_source << single_source + Group(ZeroOrMore(join_op + single_source + Optional(join_constraint)))("join")

result_column = "*" | table_name + "." + "*" | (expr + Optional(Optional(AS) + column_alias))
select_core = (SELECT + Group(delimitedList(result_column))("columns") +
                Optional(FROM + join_source).setParseAction(setObject) +
                Optional(WHERE + expr("where_expr")) +
                Optional(GROUP + BY + Group(delimitedList(ordering_term)("group_by_terms")))
                )

select_stmt << (select_core + ZeroOrMore(select_core) +
                Optional(ORDER + BY + Group(delimitedList(ordering_term))("order_by_terms"))
                )
LPAR=Suppress(“(”)
RPAR=Suppress('))
逗号=抑制(','))
AND=caselesskyword('AND')
ASC=Caselesskyword('ASC')
DESC=caselesskyword('DESC')
ON=caselesskyword('ON')
USING=caselesskyword(“USING”)
内部=caselesskyword(“内部”)
JOIN=caselesskyword(“JOIN”)
AS=Caselesskyword(“AS”)
NOT=caselesskyword(“NOT”)
SELECT=caselesskyword(“SELECT”)
FROM=caselesskyword(“FROM”)
WHERE=caselesskyword(“WHERE”)
集团=Caselesskyword(“集团”)
BY=caselesskyword(“BY”)
订单=Caselesskyword(“订单”)
LIMIT=Caselesskyword(“LIMIT”)
BETWEEN=caselesskyword(“BETWEEN”)
一元=1
二进制=2
三元=3
关键字=MatchFirst((ASC、DESC、ON、USING、INTERNAR、,
加入、作为、不是、选择、来自、位置、分组、通过、,
订单、由、限制、中间)
标识符=~关键字+单词(字母,字母+“”)
排序规则\u name=identifier.copy()
column_name=Suppress('[')+~关键字+单词(alphas,alphanums+“”)+Suppress(']'))
column\u alias=identifier.copy()
表_name=identifier.copy()
表_alias=identifier.copy()
index_name=identifier.copy()
函数名称=标识符。复制()
参数_name=identifier.copy()
expr=Forward().setName(“表达式”)
select_stmt=Forward().setName(“select语句”)
整数=正则表达式(r“[+-]?\d+”)
numeric\u literal=Regex(r“\d+(\。\d*)?([eE][+-]?\d+)?)
string_literal=QuotedString(“”)
文字值=(数字文字字符串文字)
表达式项=(
函数名+LPAR+可选(分隔符列表(expr))+RPAR|
字面值|
标识符|
列名
)

exprOperatorRecessence操作列表中的第一个条目应该是右关联的,而不是左关联的。在做出更改(并启用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