首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Pyparsing indentedBlock

Pyparsing indentedBlock
EN

Stack Overflow用户
提问于 2018-12-13 16:50:06
回答 1查看 79关注 0票数 1

我尝试使用基于以下代码的"indentedBlock“:

代码语言:javascript
复制
import pyparsing as pp
import pprint

class Parser(object):
def __init__(self):
    indentStack = [1]
    stmt = pp.Forward()
    start = pp.Word(pp.alphanums + "/" + "\." + "-" + ":" + "!" + "*"+" ")
    funcDecl = (pp.OneOrMore(start)+ pp.restOfLine)
    func_body = pp.indentedBlock(stmt, indentStack)
    funcDef = pp.Group(funcDecl + func_body)
    stmt << (funcDef)
    self.__parser = pp.OneOrMore(stmt)

def parse(self, line):
    try:
        res = self.__parser.parseString(line)
        pprint.pprint(res)
        print("done")
    except pp.ParseException as x:
        print(x)

在应用之后,我得到了以下错误:

预期W:(ABCD...)(在char 226),(第6行,第37列)

主要内容如下:

代码语言:javascript
复制
if __name__ == "__main__":
parser = Parser()

test = """first level config parameter 1-n
 second level config parameter 1-n
  thirt level config parameter 1-n
 second level config parameter 1-n
  thirt level  config parameter 1-n
first level config parameter 1-n"""

print(test)
parser.parse(test)

你知道哪里出了问题吗?

EN

回答 1

Stack Overflow用户

发布于 2018-12-14 12:17:15

对于pyparsing来说,对空格敏感的解析总是一个挑战,因为它的默认行为是跳过空格。此外,将表达式定义为有效字符包括' 'Word通常是自找麻烦。但是因为它被包装在一个indentedBlock中(它将负责在正确的位置查找换行符),所以您可以在这里使用它。

我扩展了您的测试字符串,使其包含一些空行和一些多行块,并提出了以下内容:

代码语言:javascript
复制
import pyparsing as pp

test = """\
first level config parameter 1-n
 second level config parameter 1-n

  thirt level config parameter 1-n
  thirt level config parameter n+1-m

 second level config parameter 1-n
  thirt level  config parameter 1-n
first level config parameter 1-n"""

import pyparsing as pp

indent_stack = [1]
func_body = pp.Forward()
# what you had as `start` looks like pretty much just any line of characters
stmt = pp.Word(pp.printables + " ")
func_body <<= pp.Group(stmt + pp.indentedBlock(func_body | stmt, indent_stack))

# parse your sample text and output results with pprint
pp.OneOrMore(func_body | pp.Group(stmt)).parseString(test).pprint()

提供:

代码语言:javascript
复制
[['first level config parameter 1-n',
  [[['second level config parameter 1-n',
     [['thirt level config parameter 1-n'],
      ['thirt level config parameter n+1-m']]]],
   [['second level config parameter 1-n',
     [['thirt level  config parameter 1-n']]]]]],
 ['first level config parameter 1-n']]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53758063

复制
相关文章

相似问题

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