Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ember.js/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml parsing bison/flex中的简单XML解析器_Xml Parsing_Bison_Lexer_Flex Lexer - Fatal编程技术网

Xml parsing 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<

我想使用bison/flex创建简单的xml解析器。我不需要验证、注释、参数,只需要
,其中值可以是数字、字符串或其他

例如:

<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文档
  • 直接解析XML文档以创建内部数据结构
  • 构造DOM树

  • 为此使用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
    ;