Lin Descriptor文件解析器

时间:2017-05-16 15:00:05

标签: parsing parser-generator ragel

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

我之前使用过Ragel解析器(https://en.wikipedia.org/wiki/Ragel)来解析正则表达式(Regex:https://en.wikipedia.org/wiki/Regular_expression)命令,它被证明非常方便。

但是,由于LDF-file的当前复杂性,我不确定Ragel(使用C ++作为宿主语言)是解析LDF-file的最佳方法。原因是LDF-file有很多数据不固定或不变,但根据供应商的不同而不同。此外,LDF字段必须保留对其他字段的引用,以检测文件中的错误。 当解析结构被修复时,Ragel更适合(这就是我在开发Regex解析器时发现的)

任何已经参与过这样一个项目的人都可以提供一些技巧来为Lin Descriptor文件选择合适的解析器。

Lin描述符文件的示例:http://microchipdeveloper.com/lin:protocol-app-ldf

1 个答案:

答案 0 :(得分:3)

如果您认为LALR(1)解析器不适合您的解析问题,则有限自动机不可能更好。 FA的功能严重不足。

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

在解析时尝试进行语义检查通常会导致过于复杂,错误的因素和不可扩展的解决方案。这对于野牛工具来说不是问题,而是使用它的特定风格,而不考虑我们对关注点分离的重要性的了解。

重构你现有的语法,使它只使用“只是一个语法” - 也就是说它只是生成所需的语义表示 - 可能比用其他解析器生成器重新实现要简单得多(这不太可能在任何情况下都提供任何真正的优势。

你绝对应该抵制放弃解析器生成器的诱惑,转而采用更少模块化的解决方案:你可能会成功构建一些东西,但结果可能性比现有的更难以维护和扩展。