我是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']