Parsing Lin描述符文件解析器

Parsing Lin描述符文件解析器,parsing,parser-generator,ragel,Parsing,Parser Generator,Ragel,我试图研究可能的解析器,作为开发可用于解析Lin描述符文件的PC应用程序的一部分。当前的解析器应用程序基于flex bison解析方法。现在我需要重新设计解析器,因为当前的解析器无法检测特定的错误 我以前使用过Ragel parser()解析正则表达式(Regex:)命令,它非常方便 但是,由于代码的复杂性,LDF文件,我不确定Ragel(以C++作为宿主语言)是否是解析 LDF文件< /> >的最好方法。这是因为LDF文件包含大量数据,这些数据不是固定不变的,而是根据供应商的不同而变化的。另外

我试图研究可能的解析器,作为开发可用于解析Lin描述符文件的PC应用程序的一部分。当前的解析器应用程序基于flex bison解析方法。现在我需要重新设计解析器,因为当前的解析器无法检测特定的错误

我以前使用过Ragel parser()解析正则表达式(Regex:)命令,它非常方便

<>但是,由于代码的复杂性,LDF文件,我不确定Ragel(以C++作为宿主语言)是否是解析<代码> LDF文件< /> >的最好方法。这是因为
LDF文件
包含大量数据,这些数据不是固定不变的,而是根据供应商的不同而变化的。另外,
LDF
字段必须保留对其他字段的引用,以检测文件中的错误。 当解析的结构固定时,Ragel更适合(这是我在开发Regex解析器时发现的)

任何已经参与过此类项目的人都可以提供一些技巧,为Lin描述符文件选择合适的解析器

Lin描述符文件示例:

如果您觉得LALR(1)解析器不足以解决您的解析问题,那么有限自动机不可能更好。足总的权力严格地说不那么强大

但是,在不太了解您想要实现的检查的性质的情况下,我非常确定适当的策略是使用flex/bison语法将文件解析为一些简单的层次数据结构(即某种形式的树,在解析文献中通常称为AST),然后遍历生成的数据结构以执行任何看起来必要的语义检查

在解析时尝试进行语义检查通常会导致解决方案过于复杂、考虑因素不当且不可扩展。这不是bison工具的问题,而是使用它的一种特殊风格的问题,它没有考虑到我们已经了解到的分离关注点的重要性

重构现有语法,使其使用“仅仅一个语法”——也就是说,使其仅生成所需的语义表示——可能比使用其他解析器生成器重新实现要简单得多(无论如何,这不可能提供任何真正的优势)

而且,您应该坚决抵制放弃解析器生成器而采用模块化程度更低的解决方案的诱惑:您可能成功构建了一些东西,但其结果的可维护性和可扩展性可能比您目前拥有的还要差。

如果您觉得LALR(1)解析器不足以解决您的解析问题,那么有限自动机也不可能更好。足总的权力严格地说不那么强大

但是,在不太了解您想要实现的检查的性质的情况下,我非常确定适当的策略是使用flex/bison语法将文件解析为一些简单的层次数据结构(即某种形式的树,在解析文献中通常称为AST),然后遍历生成的数据结构以执行任何看起来必要的语义检查

在解析时尝试进行语义检查通常会导致解决方案过于复杂、考虑因素不当且不可扩展。这不是bison工具的问题,而是使用它的一种特殊风格的问题,它没有考虑到我们已经了解到的分离关注点的重要性

重构现有语法,使其使用“仅仅一个语法”——也就是说,使其仅生成所需的语义表示——可能比使用其他解析器生成器重新实现要简单得多(无论如何,这不可能提供任何真正的优势)


您应该坚决抵制放弃解析器生成器而采用模块化程度更低的解决方案的诱惑:您可能会成功构建一些东西,但是,结果的可维护性和可扩展性可能会比您目前拥有的更差。

这个问题可能会从您希望解析的文件格式描述的链接中受益。@rici-为lin描述符文件添加了一个基本示例,谢谢。我查看了链接规范文档的第9节,我看不出有任何理由改变我的答案,不管它值多少钱。如果您在使用bison/flex解析该格式时遇到某些特定问题,请随意提出更具体的问题。此问题可以通过指向您希望解析的文件格式说明的链接来解决。@rici-为lin描述符文件添加了一个基本示例,谢谢。我查看了链接规范文档的第9节,我看不出有任何理由改变我的答案,不管它值多少钱。如果您有一些与bison/flex解析该格式相关的特定问题,请随时提出更具体的问题。