简单的XML解析器在bison/flex中

4
我希望使用bison/flex创建一个简单的XML解析器。我不需要验证、注释和参数,只需要处理形如<tag>value</tag>的标签,其中value可以是数字、字符串或其他<tag>value</tag>格式的内容。例如:
<div>
  <mul>
    <num>20</num>
    <add>
      <num>1</num>
      <num>5</num>
    </add>
  </mul>
  <id>test</id>
</div>

如果有帮助的话,我知道所有可能出现的标签名称,也知道给定标签可以容纳多少个子标签。是否可能创建一个Bison解析器来实现以下功能:
- 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

标签和子标签的数量:

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

你能帮我处理语法,以便创建类似上面给出的AST吗?


你是否需要使用XML的子集来完成这个任务?如果你的语言只包含算术表达式,我建议你考虑解析中缀表达式,这样你就可以使用像(20 * (1 + 5)) / test这样的字符串。除非出于其他原因需要使用XML,否则似乎有点过度设计,特别是如果你正在编写解析器的话! - anton.burger
数据保存在 XML 中,所以我别无选择。 - user360872
抱歉回复晚了,你离解决方案更近了吗?既然必须使用XML,为什么不使用已经编写好的库呢?你有选择编程语言的权利吗?还是整个练习的重点就是编写解析器?如果是这样,你必须使用解析器生成器吗?对于这样一个相对简单的语法,你可以轻松地编写递归下降解析器。 - anton.burger
1
@shambulator,是的,我的目标是不使用库编写xml解析器。由于我没有得到任何关于如何做到这一点的建议,所以我决定进行实验,并且事实证明,在bison中编写xml语法非常简单。 - user360872
这听起来太奇怪了。你为什么要用 bison 做这件事?这听起来像是一个错误的工具或者一个不好(或者至少很尴尬)的选择来做一个学习项目。 - user34537
2个回答

5
根据您的需求,我认为 yax 系统 可以很好地满足要求。从 README 中可以看到,yax 项目的目标是允许使用 YACC(实际上是 Gnu Bison)来解析/处理 XML 文档。实现上述目标的关键软件是提供一个库,该库可以从 XML 文档中生成 XML 词法记号流。这个流可以被包装成 yylex() 的实例,以向 Bison 语法提供标记并解析处理 XML 文档。使用流加上 Bison 语法,至少可以进行以下几种活动:验证 XML 文档、直接解析 XML 文档以创建内部数据结构、构造 DOM 树。

2

我认为使用它来创建XML解析器不是最佳工具。

如果我必须完成这项工作,我会手动完成。

Flex代码将包含:

  • NUM匹配整数,在此示例中。
  • STR匹配任何不包含'<'或'>'的字符串。
  • STOP匹配所有闭合标签。
  • START匹配起始标签。
<\?.*\?> { ;} 
<[a-z]+> { return START; }
</[a-z]+> { return STOP; }
[0-9]+ { return NUM; }
[^><]+ { return STR; }

Bison代码将如下所示:
%token START, STOP, STR, NUM
%%
simple_xml : START value STOP
;
value : simple_xml 
| STR
| NUM
| value simple_xml
;

由于所有的XML标签都将匹配您的第一个模式,因此它们始终会触发,您将永远看不到START或STOP。您需要在START/STOP模式之后移动该模式。 - Chris Dodd
1
第一个模式仅匹配以 "<?" 开头,以 "?>" 结尾的令牌,我不明白为什么任何 START 或 STOP 都会匹配。"<?" 相当于 "<[?]" 并匹配 "<?",而不代表 "<?" 后面有一个可选的大于号。 - VGE
1
为什么要手写语法解析器,当有许多可靠的工具已经被使用了几十年呢?这些工具是强大的,并且已经被成千上万的用户调试过。你不可能通过手写来创建一个更好的解析器。这是一个糟糕的建议。 - shrewmouse

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接