8

对于一个小型编译器项目,我们目前正在为 C 的一个子集实现一个编译器,我们决定使用 Haskell 和 megaparsec。总的来说,我们取得了不错的进展,但仍有一些我们无法正确处理的极端情况。其中之一是处理反斜杠后跟换行符。引用规范:

每个反斜杠字符 () 的实例紧跟一个换行符被删除,拼接物理源代码行以形成逻辑源代码行。只有任何物理源行上的最后一个反斜杠才有资格成为此类接头的一部分。(§5.1.1.,ISO/IEC9899:201x)

到目前为止,我们提出了两种可能的方法来解决这个问题:

1.) 实施一个预词法分析阶段,在该阶段中,初始输入被复制并且每次出现的\\\n都被删除。我们在这种方法中看到的最大缺点是我们丢失了我们需要的准确错误位置。

2.) 实现一个特殊的char'组合器,它的行为类似于char但看起来前面有一个额外的字符,并且会默默地消耗任何\\\n. 这会给我们正确的位置。这里的缺点是我们需要在任何解析器中替换每个出现的charwith char',即使是在 megaparsec 提供的像string,integerwhitespace...

很可能我们不是第一个尝试使用 parsec/megaparsec 来解析具有这种“怪癖”的语言的人,所以我可以想象有一些更好的方法可以做到这一点。有人有想法吗?

4

0 回答 0