bison / flex中的简单XML解析器

时间:2010-06-25 22:47:37

标签: xml-parsing bison lexer flex-lexer

我想使用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

标签&amp;子标签数量:

  • num:1(仅限值)
  • str:1(仅限值)
  • 添加| sub | mul | div:2(num | str | tag,num | str | tag)

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

2 个答案:

答案 0 :(得分:4)

根据您的要求,我认为yax system会运作良好。 来自自述文件:

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

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

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

使用流加上Bison语法,至少可以进行以下类型的活动。

  1. 验证XML文档,
  2. 直接解析XML文档以创建内部数据结构
  3. 构建DOM树。

答案 1 :(得分:1)

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

Flex代码将包含: 在此示例中NUM匹配整数。 STR匹配匹配任何不包含'&lt;'的字符串或''gt;'。 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
;