2013-05-01 2 views
3

Я пытаюсь совместить слово с использованием Parsley. Грамматика, которую я использую, работает только при создании правила для общего слова. Тем не менее, я хотел бы знать, почему это не работает так, как показано на презентации и примере кода Аллена Шорта здесь (http://bit.ly/1025Qxo) и здесь (http://bit.ly/17wzUYg).Возврат пустого списка с синтаксисом «или» с использованием Parsley

В своем коде, у него есть:

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 

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

Пол

+0

FWIW, то, что у вас есть, выглядит иначе, чем то, что вы говорите. (ваша скобка включает return val, где оригинал не подходит) – mgilson

ответ

2

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

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

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

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

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

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

+0

Я только что понял это в душе сегодня утром lol – Paul

Смежные вопросы