PyParsing:parseaction被称为多个

时间:2016-06-13 07:03:27

标签: python pyparsing

我是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'令牌看起来不错:为每个子令牌调用一次Parseaction' ident_simple'和一次合并令牌。

我认为合并的令牌是问题:' ident_simple'的解析如果' ident_combined'只会被调用一次被删除了。

任何人都可以给我一个如何正确组合令牌的提示吗?

感谢您的帮助

更新:在玩游戏时,我参加了课程"或者"而不是" MatchFirst"。

elems = (  ident_combined ^ ident_simple ^ integer)

这显示出更好的行为(在我看来)。

输出原始语法(使用" 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']

修改语法的输出(使用"或"):

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

0 个答案:

没有答案