Xml parsing bison/flex中的简单XML解析器
我想使用bison/flex创建简单的xml解析器。我不需要验证、注释、参数,只需要Xml parsing bison/flex中的简单XML解析器,xml-parsing,bison,lexer,flex-lexer,Xml Parsing,Bison,Lexer,Flex Lexer,我想使用bison/flex创建简单的xml解析器。我不需要验证、注释、参数,只需要值,其中值可以是数字、字符串或其他值 例如: <div> <mul> <num>20</num> <add> <num>1</num> <num>5</num> </add> </mul> <id>test<
值
,其中值可以是数字、字符串或其他值
例如:
<div>
<mul>
<num>20</num>
<add>
<num>1</num>
<num>5</num>
</add>
</mul>
<id>test</id>
</div>
标记和子标记的数量:
- num:1(仅值)
- str:1(仅限值)
- 添加| sub | mul | div:2(num | str | tag,num | str | tag)
你能帮我用语法创建上面给出的AST吗?我认为它不是创建xml解析器的最佳工具。 如果我必须做这项工作,我会手工做 Flex代码将包含: 本例中的NUM match integer。 STR匹配不包含“”的任何字符串。 停止匹配所有结束标记。 开始匹配开始标记
<\?.*\?> { ;}
<[a-z]+> { return START; }
</[a-z]+> { return STOP; }
[0-9]+ { return NUM; }
[^><]+ { return STR; }
根据你的要求,我认为这个系统会很好地工作。 自述文件: yax项目的目标是允许使用YACC(GNUbison)来解析/处理XML文档 实现上述目标的关键软件是提供一个库,该库可以从XML文档生成XML词汇标记流 可以包装此流以创建yylex()的实例,将令牌提供给Bison语法以解析和处理XML文档 使用流加上野牛语法,至少可以进行以下类型的活动
为此使用XML的子集是否重要?如果您的语言只是由算术表达式组成,我建议您改为分析中缀表达式,这将允许您使用字符串,如
(20*(1+5))/test
。除非出于其他原因需要,否则XML似乎有点过分,尤其是在编写解析器时!数据保存在XML中,因此我别无选择;你离这个问题的解决方案还有一步吗?既然必须使用XML,为什么不使用已经编写好的库呢?您可以选择编程语言吗?或者整个练习的目的就是编写解析器?如果是这样,您是否必须使用解析器生成器?对于这样一个相对简单的语法,您可以轻松地编写递归下降解析器。@shambulator,是的,编写xml解析器的目标是不使用库。因为我没有得到任何建议,所以我决定进行实验,结果证明用bison编写xml语法非常简单,这听起来太奇怪了。你为什么要用野牛来做这个?这听起来像是一个错误的工具,或者是一个糟糕的(或者至少是尴尬的)学习项目选择,因为所有的XML标记都会匹配您的第一个模式,它总是会触发它们,您永远看不到开始或停止。您需要将该模式移动到开始/停止模式之后。第一个模式将只匹配以“”开头的令牌,我不理解为什么开始或停止模式中的任何一个都会匹配。“既然有许多可靠的工具已经使用了几十年,你为什么还要手工编写语法分析器呢?这些工具非常强大,已经被成千上万的用户调试过。你无法手工创建更好的语法分析器。这是一个糟糕的建议。
<\?.*\?> { ;}
<[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
;