ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

pyparsing知道解析时递归表达式的深度吗?

2019-11-01 05:09:05  阅读:198  来源: 互联网

标签:pyparsing python recursion


我喜欢使用pyarsing定义parseAction的功能,但是我遇到了特定用例的障碍.接受输入字符串和以下简单语法:

from pyparsing import *

line = "[[one [two [three] two [three [four]]] one] zero]"
token = Word(alphas)

# Define the simple recursive grammar
grammar = Forward()
nestedBrackets = nestedExpr('[', ']', content=grammar) 
grammar << (token | nestedBrackets)

P = grammar.parseString(line)
print P

我希望结果是:

[('one',1), [('two',2), [('three',3)], ('two',2), [('three',3), [('four',4)]]] one], ('zero',0)]

即解析每个令牌并返回带有令牌和深度的元组.我知道可以在解析后完成,但是我想知道是否可以使用parseAction进行解析.这样我对全局变量的不正确尝试:

# Try to count the depth
counter = 0
def action_token(x):
    global counter
    counter += 1
    return (x[0],counter)
token.setParseAction(action_token)

def action_nest(x):
    global counter
    counter -= 1
    return x[0]
nestedBrackets.setParseAction(action_nest)

给予:

[('one', 1), ('two', 2), ('three', 3), ('two', 3), ('three', 4), ('four', 5), ('one', 3), ('zero', 3)]

解决方法:

执行此操作(剩下的一切都保留):

def openB(s, l, t):
    global count
    count += 1
def closeB(s, l, t):
    global count
    count -= 1

opener = Literal("[").setParseAction(openB)
closer = Literal("]").setParseAction(closeB)

nestedBrackets = nestedExpr(opener, closer, content=grammar) 

问题在于,嵌套不取决于匹配的嵌套组的数量,而是取决于匹配的开放式括号的数量与匹配的封闭式括号的数量.因此,您需要在分析打开/关闭方括号时而不是在分析组时调整计数.因此,您需要在组定界符而不是组本身上设置parseAction.

同样,您的示例嵌套了一层(至少在我看来是这样). “零”实际上应该是1,因为它在括号的一级内部,同样,其他所有内容都应上移一级.如果您确实希望最外面的“零”具有零级,依此类推,则需要初始化数到-1.

标签:pyparsing,python,recursion
来源: https://codeday.me/bug/20191101/1981251.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有