PyParsing:parseaction称为multi

2024-04-25 18:13:47 发布

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

我是pyparsing的初学者,但有其他解析环境的经验。 在我的第一个小演示项目中,我遇到了一个解析操作的奇怪行为:对于ident_simple的每个标记,基标记的解析操作(ident_simple)被调用两次。在

import io, sys
from pyparsing import *

def pa_ident_simple(s, l, t):
    print('ident_simple: ' + str(t))

def pa_ident_combined(s, l, t):
    print('ident_combined: ' + str(t))

def make_grammar():
    number = Word(nums) 

    ident_simple = Word( alphas, alphanums + "_" )
    ident_simple.setParseAction(pa_ident_simple)

    ident_combined = Combine(ident_simple + Literal('.') + ident_simple)
    ident_combined.setParseAction(pa_ident_combined)

    integer = number

    elems = ( ident_combined | ident_simple | integer)

    grammar = OneOrMore(elems) + StringEnd()

    return grammar


if __name__ == "__main__":
    inp_str = "UUU FFF.XXX GGG"

    grammar = make_grammar() 

    print (inp_str, "--->", grammar.parseString( inp_str ))

对于“ident_combined”标记,它看起来不错:对于每个子标记“ident_simple”调用一次Parseaction,对于组合标记调用一次。在

我认为组合标记是问题所在:如果删除了'ident\ucombined',则只调用一次'ident\usimple'的Parseaction。在

有谁能给我一个提示如何正确组合代币吗?在

谢谢你的帮助

更新:玩游戏时,我选择了“或”而不是“MatchFirst”。在

^{2}$

这显示了一种更好的行为(在我看来)。在

原始语法的输出(使用“MatchFirst”):

ident_simple: ['UUU']
ident_simple: ['UUU']
ident_simple: ['FFF']
ident_simple: ['XXX']
ident_combined: ['FFF.XXX']
ident_simple: ['GGG']
ident_simple: ['GGG']
UUU FFF.XXX GGG ---> ['UUU', 'FFF.XXX', 'GGG']

修改语法的输出(使用“Or”):

ident_simple: ['UUU']
ident_simple: ['FFF']
ident_simple: ['XXX']
ident_combined: ['FFF.XXX']
ident_simple: ['GGG']
UUU FFF.XXX GGG ---> ['UUU', 'FFF.XXX', 'GGG']

Tags: 标记fffdefpyparsingsimpleuuuxxxprint