使用Parsley返回带有'或'语法的空列表

时间:2013-05-01 01:49:12

标签: python

我正在尝试用Parsley匹配一个单词。我使用的语法仅在我为通用词制定规则时起作用。但是,我想知道为什么它不能像Allen Short的演示文稿和示例代码(http://bit.ly/1025Qxo)和此处(http://bit.ly/17wzUYg)那样显示。

在他的代码中,他有:

rule = (expr1 -> returnval) | -> []

但我让它发挥作用的唯一方法是:

rule = (expr1 -> returnval) | (expr2) -> [] 

这是我的代码:

import parsley

grammar = r"""

myword = "hello"
myrule = (myword:word -> word) | -> []
"""

MyPar = parsley.makeGrammar(grammar,{})
print MyPar("hello").myrule() # works, returns myword
print MyPar("bye").myrule() # doesn't work, throws exception

我使用它的唯一方法是使用内置的“字母”变量为通用字符串制定规则。

import parsley

grammar = r"""

myword = "hello"
anyword = <letter+>
myrule = (myword:word -> word) | anyword -> []
"""

MyPar = parsley.makeGrammar(grammar,{})
print MyPar("hello").myrule() # works
print MyPar("bye").myrule() # works, returns empty list

任何帮助将不胜感激。谢谢。

1 个答案:

答案 0 :(得分:2)

我认为你误解了规则应该匹配的内容。

myrule = (myword:word -> word) | -> []

这将尝试匹配两者中的任何一个:

  1. (myword:word -> word)尝试匹配myword并将其返回

  2. -> []尝试匹配(空字符串,而不是任何内容),并返回一个空列表

  3. 所以你期望得到的行为 如果你想匹配任何单词,我认为你的第二个代码就是这样做的。