Разбор / лексирование линейной разметки в полезную структуру данных - PullRequest
0 голосов
/ 01 ноября 2011

Проблема *

Учитывая некоторые данные (текст), к которым применяется стиль со слабо определенной разметкой, например:

The [blower]cat[elower] [weight 15]sat[normal] on the mat.[newline]

Который в идеале должен быть представлен как что-то вроде:

The <text class="lower">cat</text> <strong>sat</strong> on the mat.<br />

Разметка имеет следующие свойства:

  • Тег представляет собой инструкцию для форматирования текста заданным способом с этого момента
  • Конечный тег может существовать, но только для небольшого набора тегов. Другие теги являются линейными (см. Пункт 1)
  • Каждый тег имеет свое поведение и может по-разному влиять на ранее примененные теги.
  • Некоторое вложение подразумевается из линейных тегов, добавляющих или перезаписывающих существующие стили
  • Метаданные могут быть за пределами тегов (например, [beg] [xyz] cmd [end1] связан с тегами, без содержимого)

Требования

  • Определение правил взаимодействия тегов (например, тег стиля, например [полужирный], закрывается другим тегом стиля, например, [нормальный] или [светлый])
  • Вложение некоторого содержимого (теги, которые не перезаписываются, как указано выше, будут соответственно вкладываться и ломаться)
  • Определение карт из хорошо определенного в памяти представления в некоторый выходной формат

Мысли

  • Разобрать в DOM-подобную структуру - Попытка сгруппировать теги в «наборы». При обнаружении тега закройте активный тег для этого набора и откройте новый. Это производит содержание . Проблемы с правильным вложением и закрытием / повторным открытием тегов, чтобы вы не сталкивались с такими ситуациями, как text text text , раздражают, но достаточно просты.

Как бы вы приступили к разработке структуры данных или метода синтаксического анализа контента, чтобы набор правил мог помочь преобразованию в четко определенную структуру?

В качестве альтернативы, какие-либо предложения для полей / областей, на которые вы бы обращали внимание при решении такого рода проблем?

* Реальная проблема мира

1 Ответ

1 голос
/ 01 ноября 2011

Эта проблема изоморфна (по крайней мере, как вы ее описали) XML.У вас есть синтаксис, который вводит и заканчивает разметку, и это в основном в парах [воздуходувка] ... [elower] и [вес 15] ... [нормальный] со случайным автономным [newline].

Итак, если вы знаете, как создать синтаксический анализатор XML с тегами, вы тоже знаете, как это сделать.

Если нет, вам просто нужна грамматика (в EBNF) иГенератор парсера:

document =  fragment* ;

fragment = TEXT ;
fragment = '[blower]' fragment '[elower]' ;
fragment = '[weight' NATURAL ']' fragment '[normal]' ;
fragment =  other_start_tag fragment other_end_tag ;
fragment = '[newline]' ;

Для этого требуется довольно простой лексер и довольно простой парсер.(См. FLEX и YACC в качестве примеров).Вы можете построить DOM как набор узлов дерева, когда анализатор работает, прикрепив действия к правилам грамматики (см. Документацию YACC).Многие другие генераторы синтаксических анализаторов также позволят вам строить дерево во время синтаксического анализа.

...