Используя pyparsing для парсинга слова, разделенного на Escape по нескольким строкам

Возможно, что-то как str1. GetHashCode () + str2. GetHashCode ()? или (str1. GetHashCode () + str2. GetHashCode ()) / 2? Таким образом, это было бы то же независимо от того, подкачиваются ли str1 и str2....

5
задан gotgenes 16 November 2009 в 04:40
поделиться

2 ответа

Покопавшись немного подробнее, я наткнулся на эту ветку справки , где был этот примечательный бит

Я часто вижу неэффективные грамматики, когда кто-то реализует грамматику 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: Чтобы компенсировать более сложные тестовые случаи, я изменил код следующим образом:

5
ответ дан 13 December 2019 в 22:10
поделиться

Вы довольно близко знакомы со своим кодом. Подойдет любой из этих модов:

# '|' 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, но вы уже нашли этот материал (я полагаю, в вики).

5
ответ дан 13 December 2019 в 22:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: