Синтаксический анализ разметки викимедиа - плохо ли подходят анализаторы на основе EBNF?

StackOverflow https://stackoverflow.com/questions/1093036

Вопрос

Я пытаюсь проанализировать (на Java) разметку Викимедиа, найденную в Википедии.Существует несколько существующих пакетов для этой задачи, но я не нашел ни одного, который бы особенно хорошо соответствовал моим потребностям.Лучший пакет, с которым я работал, - это Анализатор Mathclipse Bliki, который выполняет достойную работу на большинстве страниц.

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

Пытаясь найти лучший механизм синтаксического анализа, я исследовал использование анализатора на основе EBNF для этой задачи (в частности, ANTLR).Однако после некоторых попыток выяснилось, что этот подход не особенно хорошо подходит для этой задачи, поскольку разметка Викимедиа относительно упрощена и, следовательно, ее нелегко вписать в структурированную грамматику.

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

@Стобор:Я уже упоминал, что просмотрел различные механизмы синтаксического анализа, включая те, которые были возвращены запросом Google.Лучшее, что я нашел на данный момент, - это движок Bliki.Проблема в том, что исправление проблем с такими анализаторами становится невероятно утомительным, потому что все они по сути представляют собой длинные цепочки условных выражений и регулярных выражений, в результате чего получается спагетти-код.Я ищу что-то более похожее на метод синтаксического анализа EBNF, поскольку этот метод намного понятнее и лаконичнее, и, следовательно, его легче понять и развить.Я видел ссылку mediawiki, которую вы разместили, и она, кажется, подтверждает мои подозрения, что EBNF из коробки плохо подходит для этой задачи.Таким образом, я ищу механизм синтаксического анализа, который был бы ясным и понятный, как EBNF, но также способный обрабатывать беспорядочный синтаксис вики-разметки.

Это было полезно?

Решение

Синтаксический анализ контента mediawiki в любом общем смысле практически невозможен без использования самого mediawiki.Чтобы проанализировать его, вам нужно уметь полностью анализировать HTML и CSS (поскольку они могут быть встроены) и обрабатывать полное создание и расширение шаблона, а также любое дополнение синтаксического анализатора, которое могло использоваться соответствующим контентом.Создание экземпляра этого шаблона эквивалентно препроцессору.

Это в некотором смысле похоже на синтаксический анализ C ++, за исключением того, что анализатор также обрабатывает искаженный ввод и произвольные синтаксические дополнения, сделанные расширениями синтаксического анализатора.Фактическая реализация mediawiki во многом похожа на Perl 5, первоначальная реализация была не такой уж плохой, потому что все крайние случаи просто выпадают, однако вещи связаны друг с другом, но на самом деле заставить любую последующую реализацию делать то же самое действительно сложно, тем более что поведение часто является возникающим и недокументированным, не разработанным.

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

Короче говоря, нет, EBNF-грамматик не очень хорошо подходит для разбора разметки mediawiki, но на самом деле ничего такого нет...

Другие советы

Вы правы, Викимедиа не подходит для четко определенных грамматиков EBNF.

Вам нужно будет взглянуть на инструменты, которые будут выполнять обратный анализ, чтобы иметь возможность анализировать Wiki

btyacc, который является обратным yacc.http://www.siber.com/btyacc/

Вы могли бы посмотреть на Акцент.Лучше, чем Yacc http://accent.compilertools.net/

Или же вам, возможно, придется сделать разбивку и изучить какой-нибудь вариант prolog и свернуть его самостоятельно.Чем бы вы ни занимались, у вас впереди интересный период обучения.

Удачи

Однажды я попытался написать синтаксический анализатор для Boost.Быстрая книга, который по сути совпадает с вики-текстом , используемым Википедией.

Это был очень утомительный процесс только для того, чтобы заставить работать некоторые основы, но я думаю, что в конечном итоге для этого можно было бы написать грамматику EBNF.Если вам интересно, мой частичный анализатор доступно онлайн (грамматика встроена в doc-строки).

Этот ответ немного нестандартен, но как насчет рендеринга текста, а затем синтаксического анализа HTML Dom, чтобы определить различные компоненты wiki?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top