Шаги и участие в реализации парсера (в .Net - и в данном случае XPath 2.0) - PullRequest
6 голосов
/ 24 августа 2010

В отсутствие каких-либо хороших бесплатных реализаций XPath 2.0 для .Net, основанных на Linq to XML, я подумал о реализации своей собственной (также для своего опыта).Но для ясности (а не для создания чего-то существующего) я обнаружил следующие реализации XPath 2.0:

  • Saxon .Net
  • Машина запросов -У меня были проблемы с этим - исключения с примерами
  • XQSharp - может быть хорошим, но коммерческим (один разработчик ~ 300 $)

Теперь яХотелось бы подумать о том, насколько сложно реализовать какой-либо язык, такой как выражения XPath 2.0.Я нашел эту ссылку, которая имеет выражение EBNF для XPath 2.0: http://www.w3.org/TR/2007/REC-xpath20-20070123/#id-grammar, и я думаю сделать это в F # с комбинацией fslex / fsyacc.

Мой фон (субъективно): я играл с этими инструментами раньше, но только для некоторых простых выражений и очень простого языка программирования.Кроме того, я прочитал большую часть книги Dragon и реализацию компилятора Appel Modern в ML - но, к сожалению, я не применил теорию на практике во время чтения.Я изучал информатику в течение года, где закончил курсы по теории ex finite automaton, CFL и алгоритмам, но я работал разработчиком в течение многих лет до университета (несколько лет с профессиональной работой - бэк-эндсайты в основном).

Теперь, шаги разбора и то, что я склонен освещать:

  1. Lex - Парсинг - Сокращения: FsLex / FsYacc.Вначале я не буду охватывать ВСЕ Xpath 2.0, но, по крайней мере, все, что может сделать XPath 1.0, + немного больше.
  2. Семантический анализ - я не уверен в том, сколько стоит этот
  3. Оптимизация - я не склонен освещать это (по крайней мере, сначала)
  4. Фактический обход и т. Д.
  5. ...?

Теперь, конкретные вопросы в дополнение к вышесказанному:

  1. Насколько сложно создать парсер такого размера?исходя из своего прошлого, могу ли я это сделать?
  2. Есть ли какие-то важные шаги, которые я пропустил в отношении XPath 2.0, в частности?
  3. Есть ли какие-то технологии, которые я пропустил;Должен ли я покрывать больше, чем просто XPath 2.0 и XDocument и т. Д., Чтобы иметь возможность создавать синтаксический анализатор?

Чтобы было ясно: Я хочу сделать XPath 2.0синтаксический анализатор и ход XDocument и т. д. с этим разобранным выражением.Я думаю, что в совокупности это механизм запросов.

Обновление: Я нашел это: http://www.w3.org/2007/01/applets/xpathApplet.html, который содержит код для анализа и обхода.Я думаю, что это было бы хорошим началом или ссылкой: -)

Ваши ответы будут оценены.

Ответы [ 3 ]

4 голосов
/ 24 августа 2010

Три года назад я полностью реализовал парсер XPath 2.0 в XSLT 2.0 .

Я использовал мой LR Parsing Framework в FXSL , и это было не так сложно. Грамматика довольно большая - 209 правил, если я хорошо помню. Я использовал модификацию YACC (сделанную мной), которую я называю Yaccx , чтобы сгенерировать таблицы синтаксического анализа в виде XML. Это входные данные для общего синтаксического анализатора LR , написанные на XSLT.

Для такого рода проектов вам необходимо выделить как минимум 6 месяцев на полный рабочий день, может быть, 1 год . Сложность заключается в реализации огромной библиотеки функций ( F & O ).

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

Итак, будьте готовы ко всем этим трудностям.

4 голосов
/ 27 августа 2010

Я один из разработчиков XQSharp, поэтому у меня есть опыт в этой области. XQSharp фактически начал свою жизнь как реализация XPath, прежде чем мы расширили его для поддержки XQuery.

Наше первоначальное внедрение заняло у нас около 6 месяцев, хотя это было не единственное, над чем мы работали в то время.

После этого времени у нас была полная реализация. Было много областей, в которых это не было полностью совместимо, где стандартные методы .NET не вели себя так же, как требуемая спецификация. Некоторыми примерами этого являются преобразование значений в строки и из строк, регулярные выражения, много вещей в Unicode, проблемы с представлениями XML .NET (например, обработка xml: base) и т. Д.

Для реализации этого необходимо было сделать несколько областей:

Синтаксический : Сам синтаксический анализатор был прост и в основном генерировался из спецификации EBNF. Я бы оценил, что это изначально представляло собой работу за несколько недель.

Модель данных : Как данные представлены. Чтобы иметь полную реализацию XPath, необходимо реализовать много новых типов данных (например, xs: gDay). В нашем случае все наши элементы являются производными от базового типа, и все наши выражения возвращали бы их перечислители. Вы также должны иметь возможность определить, соответствует ли тип элемента конкретному типу XPath. Мы с самого начала поддерживали статическую типизацию и понимание схемы, но без этих функций этот раздел, вероятно, станет тривиальным, но вы все еще ожидаете работы за несколько недель.

Выражения / Абстрактное синтаксическое дерево Это модель самого выражения. Мы использовали документ формальной семантики XQuery для создания сопоставления различных конструкций XPath (например, осей и предикатов) с более простым базовым грамматиком (который заканчивается огромным количеством выражений let, if и typeswitch!). В нашей первоначальной реализации все эти выражения имели методы оценки, как и окончательное представление выражения. В нашем случае все выражения также имеют методы проверки типа, но это может быть пропущено изначально (основное назначение - оптимизация). Создание всех этих выражений снова заняло несколько недель.

Функция Как указывал предыдущий комментатор, библиотека функций для XPath довольно велика. Вся библиотека XPath заняла у нас несколько месяцев.

Статический анализ Требуется небольшое количество статического анализа. Ссылки на переменные и вызовы функций должны быть связаны с правильными переменными и функциями. Большинство реализаций XPath основаны на стеке, поэтому фаза выделения стека требуется для назначения указателей (или индексов) всем переменным. Этот статический анализ занял неделю или две. Книга Дракона должна помочь вам решить большинство из этих проблем.

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

После всей этой работы у нас осталась в основном функциональная реализация XPath; но это было очень медленно для реального использования (возможно, в 100 раз медленнее, чем XPath 1 в .NET). Так что после этого начинается веселая работа - Оптимизация.

Для доведения движка до 100% соответствия и добавления оптимизаций, вероятно, потребовалось еще 12-18 человеко-месяцев (хотя мы, вероятно, немного отстали от оптимизации!), Но к этому моменту мы уже перешли к реализации XQuery .

Мой совет - начать с подмножества XPath (может быть, только с прямыми осями и очень ограниченной библиотекой функций), и вы сможете собрать реализацию через месяц или два, но серьезная реализация XPath2 будет большие инвестиции во времени.

Убедитесь, что вы используете XPathNavigator для представления своего узла, поскольку у него есть такие методы, как SelectChildren, которые могут использовать преимущества индексов в базовых представлениях (например, XPathDocument).

3 голосов
/ 24 августа 2010

Чтобы ответить на ваш третий конкретный вопрос, в Книге Дракона не упоминаются библиотеки грамматики синтаксического анализа (PEG) / парсера Packrat / комбинатора парсера, которые сейчас очень популярны, особенно когда речь идет о функциональных языках.См., Например, FParsec .

...