繁体   English   中英

在左侧带有可选的Pyparsing

[英]Pyparsing with Optional at left

我有这样的东西

IDENTIFIER = Word(alphas + '_', alphanums + '_') #words
GENERIC_TYPE = Regex('[a-zA-Z_]+[a-zA-Z0-9_]*(\<[a-zA-Z0-9_]+\>)?') #List<string> or int
AMF = Keyword('public') | Keyword('private') | Keyword('protected') #method modifier
SFMF = Optional(Keyword('static')) & Optional(Keyword('final')) #static and final modifiers

对于此示例:

res = (Optional(AMF) + 
       SFMF + 
       IDENTIFIER).parseString('Method')
print(res)

它打印: ['Method']但是如果我添加Optional(GENERIC_TYPE)

res = (Optional(AMF) +
       SFMF +
       Optional(GENERIC_TYPE) +
       IDENTIFIER).parseString(text)
print(res)

它为text='int Method'打印['int', 'Method'] ,但是BUT引发'final Method' (或者只是'Method' )的异常:

pyparsing.ParseException: Expected W:(abcd...,abcd...) (at char 12), (line:1, col:13)

看起来pyparsing没有看到Optional的东西,因为如果GENERIC_TYPE是可选的(就像之前的很多东西一样),它应该走得更远并解析IDENTIFIER部分。

更新:

问题似乎在于解析的逻辑。 如果有两个相等的模式,而其中一个是可选的,则解析器不会检查是否是第二个。 例如:

m = Optional('M') + Literal('M')
m.parseString('M')

解析器将“ M”与第一部分匹配,然后错过“非可选文字”部分。

所以现在的问题是我可以解析它,使其与第二个匹配。 它可能不在字符串或行的末尾,所以我不能使用它。

我会说:“ GENERIC_TYPE必须后面跟一个IDENTIFIER”。 因此,要清除语法问题,请将res重写为:

res = (Optional(AMF) +
       SFMF +
       Optional(GENERIC_TYPE + FollowedBy(IDENTIFIER)) +
       IDENTIFIER).parseString(text)

您也可以这样写:

res = (Optional(AMF) +
       SFMF +
       (GENERIC_TYPE + IDENTIFIER | IDENTIFIER)).parseString(text)

Pyparsing 不会做这样一个正则表达式会做任何向前看,你必须把它列入你的语法定义中明确。

另外,由于IDENTIFIER将匹配任何字符串,因此您可能需要定义一个与所有语言关键字匹配的表达式,例如'keyword',然后将IDENTIFIER定义为:

keyword = MatchFirst(map(Keyword,"public private protected static final".split()))
IDENTIFIER = ~keyword + Word(alphas + '_', alphanums + '_')

最后,您可能希望GENERIC_TYPE不仅处理简单的container<type>定义,例如Map<String,String>Map<String,List<String>>甚至Map<String,Map<String,Map<String,Map<String,Map<String,String>>>>>

这将解析所有这些:

GENERIC_TYPE = Group(IDENTIFIER + nestedExpr('<', '>', content=delimitedList(IDENTIFIER)))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM