首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >3.0的语法分析问题与2.4的语法分析有关

3.0的语法分析问题与2.4的语法分析有关
EN

Stack Overflow用户
提问于 2021-12-18 12:09:48
回答 1查看 135关注 0票数 1
代码语言:javascript
复制
      """
        method to parse filter string
        """

        prop = pp.WordStart(pp.alphas) + pp.Word(pp.alphanums +
                                                 "_").setResultsName("prop")
        value = (pp.QuotedString("'") | pp.QuotedString('"') | pp.Word(
            pp.printables, excludeChars=",")).setResultsName("value")
        types_ = pp.oneOf("re eq ne gt ge lt le").setResultsName("types")
        flags = pp.oneOf("C I").setResultsName("flags")
        comma = pp.Literal(',')
        quote = (pp.Literal("'") | pp.Literal('"')).setResultsName("quote")

        type_exp = pp.Group(pp.Literal("type") + pp.Literal(
            "=") + quote + types_ + quote).setResultsName("type_exp")
        flag_exp = pp.Group(pp.Literal("flag") + pp.Literal(
            "=") + quote + flags + quote).setResultsName("flag_exp")

        semi_expression = pp.Forward()
        semi_expression << pp.Group(pp.Literal("(") +
                                    prop + comma + value +
                                    pp.Optional(comma + type_exp) +
                                    pp.Optional(comma + flag_exp) +
                                    pp.Literal(")")
                                    ).setParseAction(
            self.parse_filter_obj).setResultsName("semi_expression")

        expr = pp.Forward()
        expr << pp.infixNotation(semi_expression, [
            ("not", 1, pp.opAssoc.RIGHT, self.not_operator),
            ("and", 2, pp.opAssoc.LEFT, self.and_operator),
            ("or", 2, pp.opAssoc.LEFT, self.or_operator)
        ])        
       result = expr.parseString(filter_str)

这对于pyparation2.4.7很好,但对最新的pyparsing却不起作用。给出的示例输入如下:

代码语言:javascript
复制
  filter_str = 'not (dn,"org-root/ls-C1_B1", type="eq")'

这将导致出现最新的latest解析模块3.0.6的异常。

代码语言:javascript
复制
pyparsing.exceptions.ParseException: Expected 'or' term, found 'dn'  (at char 5), (line:1, col:6). 

我尝试了不同的方法来解决这个问题,但没有排除这个异常。如果这种做法有明显的错误,请告诉我。

EN

回答 1

Stack Overflow用户

发布于 2021-12-18 22:35:04

抓得好!这是pyparing3.0中PEP8 8兼容性逻辑中的一个bug,在这里,我向WordStart添加了对参数的支持,支持wordCharsword_chars。我会在下一个版本中修复它。同时,您可以通过将Word(pp.alphas)更改为Word(word_chars=pp.alphas)来解决该错误。

解析器上的其他几个注释:

  • 没有必要使用pyparsing定义semi_expressionexprsemi_expression不是递归表达式,expr中的递归已经在infixNotation方法中得到了处理。

F 214

  • 由于语法的一部分是一个自由定义的属性名,为了避免语法中可能存在的歧义,我将定义语法中的所有文字,这些文字也将与使用pp.Keywordprop匹配(例如,将pp.Literal("type")改为pp.Keyword("type"),以及您的运算符"not“、" and”和“or”)。

这些注释与您所看到的问题无关,如果没有这些更改,您的语法就会正常工作。它们只是您可能选择对解析器代码进行的一些可选的改进。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70403306

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档