4

我想使用 bison/flex创建简单的 xml 解析器。我不需要验证、注释、参数,只有<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(唯一值)
  • str:1(唯一值)
  • 添加 | 子 | 穆尔| div: 2 (num | str | tag, num | str | tag)

你能帮我用语法来创建上面给出的 AST 吗?

4

2 回答 2

5

对于您的要求,我认为yax 系统会运行良好。从自述文件:

yax 项目的目标是允许使用 YACC(实际上是 Gnu Bison)来解析/处理 XML 文档。

实现上述目标的关键软件是提供一个库,该库可以从 XML 文档生成 XML 词法标记流。

可以包装此流以创建 yylex() 的实例,以将标记提供给 Bison 语法以解析和处理 XML 文档。

使用流加上 Bison 语法,至少可以承载以下几种活动。

  1. 验证 XML 文档,
  2. 直接解析 XML 文档以创建内部数据结构,
  3. 构建 DOM 树。
于 2012-08-16T16:35:31.840 回答
2

我不认为它是用于创建 xml 解析器的最佳工具。如果我必须做这项工作,我会亲手做。

Flex 代码将包含:在此示例中,NUM 匹配整数。STR 匹配匹配任何不包含 '<' 或 '>' 的字符串。STOP 匹配所有结束标签。START 匹配起始标签。

<\?.*\?> { ;} 
<[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
;
于 2010-12-22T09:52:33.487 回答