我正在尝试用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
任何帮助将不胜感激。谢谢。
保
答案 0 :(得分:2)
我认为你误解了规则应该匹配的内容。
myrule = (myword:word -> word) | -> []
这将尝试匹配两者中的任何一个:
(myword:word -> word)
尝试匹配myword
并将其返回
-> []
尝试匹配无(空字符串,而不是任何内容),并返回一个空列表
所以你期望得到的行为 如果你想匹配任何单词,我认为你的第二个代码就是这样做的。