Возможно, что-то как str1. GetHashCode () + str2. GetHashCode ()? или (str1. GetHashCode () + str2. GetHashCode ()) / 2? Таким образом, это было бы то же независимо от того, подкачиваются ли str1 и str2....
Покопавшись немного подробнее, я наткнулся на эту ветку справки , где был этот примечательный бит
Я часто вижу неэффективные грамматики, когда кто-то реализует грамматику pyparsing непосредственно из определения BNF. BNF не имеет понятия «одно или больше »или« ноль или больше »или "optional" ...
С этим у меня возникла идея изменить эти две строки
multi_line_word = Forward()
multi_line_word << (word | (split_word + multi_line_word))
на
multi_line_word = ZeroOrMore(split_word) + word
Это позволило выводить то, что я искал: ['super', 'cali' , fragi ',' listic ']
.
Затем я добавил действие синтаксического анализа, которое объединит эти токены вместе:
multi_line_word.setParseAction(lambda t: ''.join(t))
Это дает окончательный результат [' supercalifragilistic ']
.
Я понял, что нельзя просто войти в Мордор .
Просто шучу.
Главное сообщение состоит в том, что просто невозможно реализовать одно- преобразование BNF в одно с помощью pyparsing. Следует использовать некоторые уловки с использованием итеративных типов.
РЕДАКТИРОВАТЬ 2009-11-25: Чтобы компенсировать более сложные тестовые случаи, я изменил код следующим образом:
Вы довольно близко знакомы со своим кодом. Подойдет любой из этих модов:
# '|' means MatchFirst, so you had a left-recursive expression
# reversing the order of the alternatives makes this work
multi_line_word << ((split_word + multi_line_word) | word)
# '^' means Or/MatchLongest, but beware using this inside a Forward
multi_line_word << (word ^ (split_word + multi_line_word))
# an unusual use of delimitedList, but it works
multi_line_word = delimitedList(word, continued_ending)
# in place of your parse action, you can wrap in a Combine
multi_line_word = Combine(delimitedList(word, continued_ending))
Как вы обнаружили в своем поиске в Google по pyparsing, переводы BNF-> pyparsing должны выполняться с особым вниманием к использованию функций pyparsing вместо BNF, ммм, недостатков. На самом деле я был в процессе составления более длинного ответа, касающегося большего количества проблем с переводом BNF, но вы уже нашли этот материал (я полагаю, в вики).