Генерация правил соответствия lex и правил грамматики yacc из XML DTD - PullRequest
2 голосов
/ 27 декабря 2011

Обзор

Хотя этот вопрос касается lex / yacc, которые написаны на C, он в основном сосредоточен вокруг программирования на python.

У меня есть несколько очень похожих DTDчто я использую для разбора документа.Этот раздел программы написан на C, и для этого просто не нужно вызывать полный обработчик SAX (, а именно , libxml2 ).Поскольку DTD (и, следовательно, файлы XML) имеют статический формат, я думаю, что эту проблему лучше всего решить с помощью lex и yacc.

При написании полного лексического анализатора для any XMLДокумент слишком сложен, написание одного документа для определенного подмножества XML-документов полностью управляемо.DTD может использоваться для генерации лексического анализатора (который использует токены для ввода), а также генератора синтаксических анализаторов в YACC.

Я хочу сделать два предположения:

  1. XML-документ правильно сформирован в отношении REC-xml-19980210
  2. XML-документ действителен по отношению к его DTD

Поэтому, если XML-документ не удовлетворяет ни одному из вышеперечисленных, лексический анализатор / анализатор должен просто перестать работать для этого конкретногофайл.

Вопросы

Моя конечная цель - написать скрипт на python, который успешно: (1) анализирует DTD;и (2) генерирует файлы lex / yacc.Прежде чем начать, у меня есть несколько вопросов:

  1. Эта проблема уже решена?
    • Если так, есть ли какие-нибудь библиотеки, на которые мне следует обратить внимание?
    • Если нет, то не потому ли, что нет решения с использованием инструментов, которые я упомянул?
  2. Существуют ли лучшие (измеряемые производительностью) способы извлечения «содержимого» без разметки из файлов XML, чем при использовании статического парсера?

Я понимаю, что могу использовать PLY для разбора DTD, но поскольку я заинтересован в создании файлов lex / yacc для включения в программу на C, эта опция не будет работать.Поэтому я думаю, что я мог бы использовать xml.parsers.expat для разбора DTD.Это позволяет мне регистрировать обратные вызовы, которые отслеживают имена элементов, их положение в дереве, требуются ли они, и т. Д. Это должно дать мне достаточно информации для генерации файлов lex / yacc, но я бы хотелпосмотрите, что вы, ребята, советуете.

1 Ответ

0 голосов
/ 27 июля 2012

Используйте комбинацию XML Lexer , yacc грамматика и расширение YAXX для создания соответствующих файлов.

...