Простой XML-парсер в bison / flex - PullRequest
4 голосов
/ 26 июня 2010

Я хотел бы создать простой xml-парсер , используя bison / flex. Мне не нужны проверка, комментарии, аргументы, только <tag>value</tag>, где значение может быть числом, строкой или другим <tag>value</tag>.

Так, например:

<div>
  <mul>
    <num>20</num>
    <add>
      <num>1</num>
      <num>5</num>
    </add>
  </mul>
  <id>test</id>
</div>

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

- new Tag("num", 1)           // tag1
- new Tag("num", 5)           // tag2
- new Tag("add", tag1, tag2)  // tag3
- new Tag("num", 20)          // tag4
- new Tag("mul", tag4, tag3)
...
- root = top_tag

Метка и количество под-тегов:

  • число: 1 (только значение)
  • стр: 1 (только значение)
  • добавить | суб | муль | div: 2 (num | str | tag, num | str | tag)

Не могли бы вы помочь мне с грамматикой, чтобы иметь возможность создавать AST, как указано выше?

Ответы [ 2 ]

4 голосов
/ 16 августа 2012

Для ваших требований, я думаю, система Yax будет работать хорошо.Из README:

Цель проекта yax - разрешить использование YACC (фактически Gnu Bison) для анализа / обработки документов XML.

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

Этот поток можно обернуть, чтобы создать экземпляр yylex () для подачи токенов в грамматику Bison для анализа и обработкиДокумент XML.

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

  1. Проверка документов XML,
  2. Непосредственноанализ XML-документов для создания внутренних структур данных,
  3. Построение DOM-деревьев.
1 голос
/ 22 декабря 2010

Я не думаю, что это лучший инструмент для создания парсера xml.Если мне нужно выполнить эту работу, я сделаю это вручную.

Код Flex будет содержать: NUM соответствует целому числу в этом примереСоответствие STR соответствует любой строке, которая не содержит «<» или «>».ОСТАНОВИТЬ сопоставить все закрывающие теги.Начальные теги START match.

<\?.*\?> { ;} 
<[a-z]+> { return START; }
</[a-z]+> { return STOP; }
[0-9]+ { return NUM; }
[^><]+ { return STR; }

Код бизона будет выглядеть как

%token START, STOP, STR, NUM
%%
simple_xml : START value STOP
;
value : simple_xml 
| STR
| NUM
| value simple_xml
;
...