3

パセリを使って単語を一致させようとしています。私が使用している文法は、一般的な単語のルールを作成する場合にのみ機能します。ただし、ここ ( http://bit.ly/1025Qxo ) とここ ( http://bit.ly/17wzUYg )の Allen Short のプレゼンテーションとサンプル コードから示されているように機能しない理由を知りたいです。.

彼のコードでは、次のようになっています。

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) | -> []

これは、次の 2 つのいずれかに一致しようとします。

  1. (myword:word -> word)一致を試み、mywordそれを返します

  2. -> []何も一致させようとせず(空の文字列であり、何にも一致しない)、空のリストを返します。

したがって、あなたが得ている動作は期待されています。
任意の単語に一致させたい場合は、2 番目のコードがその方法だと思います。

于 2013-05-02T07:36:07.047 に答える