对于一个小型编译器项目,我们目前正在为C子集实现编译器,我们决定使用Haskell和megaparsec。总的来说,我们取得了很好的进展,但仍有一些我们无法正确处理的极端情况。其中之一是反斜杠的处理,然后换行。引用规范:
反斜杠字符()的每个实例紧跟一个 删除换行符,拼接物理源行以形成 逻辑源代码行。只有任何物理来源的最后反斜杠 线路有资格成为这种拼接的一部分。 (§5.1.1。,ISO / IEC9899:201x)
到目前为止,我们提出了两种可能解决此问题的方法:
1。)实现一个前期阶段,其中复制初始输入并删除\\\n
的每个出现。我们在这种方法中看到的最大缺点是我们丢失了我们需要的准确错误位置。
2.。)实现一个特殊的char'
组合子,其行为类似char
,但前面会看到一个额外的字符,并会默默消耗任何\\\n
。这会给我们正确的立场。这里的缺点是我们需要在任何解析器中用char
替换 char'
的每个出现,即使在像Megarsec提供的那些string
,{{{ 1}},integer
等...
我们很可能不是第一个尝试用parsec / megaparsec解析语言的人,所以我可以想象有一些更好的方法可以做到这一点。有没有人有想法?