加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

YAML解析 – lex还是手卷?

发布时间:2020-12-15 02:11:23 所属栏目:百科 来源:网络整理
导读:我正在尝试编写一个简单的YAML解析器,我从yaml.org读取了规范, 在开始之前,我想知道编写手动解析器是否更好,或者 使用lex(flex / bison).我看了libyaml(C库) – 似乎没有使用lex / yacc. YAML(不包括流程样式),似乎更加面向行,所以,它是 更容易编写手动解析
我正在尝试编写一个简单的YAML解析器,我从yaml.org读取了规范,
在开始之前,我想知道编写手动解析器是否更好,或者
使用lex(flex / bison).我看了libyaml(C库) –
似乎没有使用lex / yacc.
YAML(不包括流程样式),似乎更加面向行,所以,它是
更容易编写手动解析器,或使用flex / bison
谢谢.

解决方法

这个答案基本上是对这个问题的回答:“我应该使用自己的解析器还是使用解析器生成器?”和YAML没什么关系.但是它会“回答”你的问题.

你需要问的问题不是“这是否适用于这种特定的语言/语法”,而是“我是否有信心实现这一点”.问题的真相是,您要解析的大多数格式只能与生成的解析器一起使用.另一个事实是,用简单的手写recursive descent parser来解析复杂的语言是可行的.

我已经写过其中一个,一个用于EDDL的递归下降解析器(C和结构化元素)和一个用于INI的bison / flex解析器.我选择了这些例子,因为它们反对直觉和外部要求决定了决定.

既然我在技术层面建立了它是可能的,为什么你会选择一个而不是另一个?这是一个很难回答的问题,这里有一些关于这个主题的想法:

>写一个好的词法分析器真的很难.在大多数情况下,使用flex来生成词法分析器是有意义的.除非你有非常奇特的输入格式,否则很少使用手动滚动自己的词法分析器.
>使用bison或类似的生成器使得用于解析的语法明确可见.这里的主要好处是,维护解析器五年的开发人员将立即看到使用的语法,并可以将其与任何规范进行比较.
>使用递归下降解析器可以很清楚解析器中发生了什么.这为优雅地处理哈里冲突提供了简单的方法.您可以编写一个简单的if,而不是将整个语法重新排列为LALR1.
>在开发解析器时,您可以使用手写解析器“掩盖细节”,使用野牛这几乎是不可能的.在野牛中,语法必须有效,否则发电机不会做任何事情.
> Bison在指出语法中的正式缺陷方面非常棒.不幸的是,你可以独自修理它们.当手动滚动解析器时,只有在解析器读取废话时才会发现缺陷.

这不是一个或另一个的明确答案,但它指出了正确的方向.既然看起来你正在编写解析器以获得乐趣,我认为你应该编写两种类型的解析器.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读