秒差距或快乐(亚历克斯)或UU-parsinglib(Parsec or happy (with a

2019-07-19 14:42发布

我打算写的Verilog的(或VHDL)语言解析器,并会做解析数据的大量操作的(排序变换)。 我打算解析非常大的文件(完整的Verilog设计,大如10K线),我最终将支持大多数的Verilog。 我不介意,但是打字我不希望重写代码的任何部分,每当我增加对一些规则的支持。

在Haskell中,你会推荐哪个库? 我知道Haskell和已经使用前快乐(玩)。 我觉得有使用秒差距在代码转换分析的字符串(这是一个巨大的加号)的可能性。 我有UU-paringlib没有经验。

因此,要分析它们中的哪一个建议的Verilog / VHDL的全语法? 我最关心的是易用性和“正确”与我可以在我的心血来潮操作解析数据。 速度不是一个主要问题。

Answer 1:

我个人更喜欢秒差距与亚历克斯的帮助下进行记载。

我更喜欢在秒差距高兴,因为1)秒差距是一个图书馆,而快乐是一个程序,如果你用得开心,然后用快乐编译,你会用不同的语言编写。 2)秒差距为您提供了上下文敏感由于其单一产品的界面解析能力。 您可以使用额外的状态上下文敏感的解析,然后检查,并根据该州决定。 或者只是看一些解析值之前和未来的解析器等决定(比如a <- parseSomething; if test a then ... do ... ),当你不需要任何上下文相关的信息,你可以简单地使用应用性的风格,并得到一个实现像YACC或类似的工具来实现。

作为秒差距的一个缺点,你永远不知道,如果你的秒差距解析器包含左递归,和你的解析器将卡在运行时(因为秒差距基本上是一个自上而下的递归下降解析器)。 你必须找到左递归和消除它们。 YACC风格的解析器可以给你一些静态保障和信息(如移位/减少冲突,未使用的端子等),你不能用秒差距获得。

亚历克斯,强烈建议在这两种情况下( 我认为你必须使用亚历克斯,如果你决定去与快乐 )词法。 因为即使你用秒差距,它真的可以简化您的解析器实现,并捕捉虫子大量太(例如:解析关键字作为标识符是一个常见的错误我,而我是用秒差距不亚历克斯这只是一个例子)。

你可以看看我的Lua解析器在亚历克斯+秒差距实现,这里的在秒差距使用亚历生成的令牌代码 。

编辑:感谢John L更正。 显然,你可以做上下文敏感的解析与快乐。 此外,亚历克斯的词法不快乐的需要,但它的建议。



文章来源: Parsec or happy (with alex) or uu-parsinglib