Я пытаюсь сопоставить слово с помощью петрушки. Грамматика, которую я использую, работает только тогда, когда я устанавливаю правило для общего слова. Однако я хотел бы знать, почему это не работает так, как показано в презентации Аллена Шорта и образце кода здесь (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

Единственный способ заставить его работать - это создать правило для общей строки слов, используя встроенную переменную letter.

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

Любая помощь будет оценена. Спасибо.

Павел

3
Paul 1 Май 2013 в 05:49
FWIW, то, что у вас есть, выглядит не так, как вы говорите. (ваша скобка включает return val, где в оригинале нет)
 – 
mgilson
1 Май 2013 в 06:15

1 ответ

Лучший ответ

Я думаю, вы неправильно понимаете, чему должно соответствовать правило.

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

Это попытается сопоставить любой из двух:

  1. (myword:word -> word) пытается сопоставить myword и возвращает его

  2. -> [] пытается найти ничего (пустая строка, ничего) и возвращает пустой список

Таким образом, вы ожидаете ожидаемого поведения.
Если вы хотите сопоставить любое слово, я думаю, что ваш второй код - это способ сделать это.

2
stranac 2 Май 2013 в 11:36