3

我正在尝试使用 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

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

保罗

4

1 回答 1

2

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

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

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

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

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

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

于 2013-05-02T07:36:07.047 回答