Elegante Methode zum Parsen von "Zeilenspleißen" (Backslashs gefolgt von einem Zeilenumbruch) in megaparsec

8

Für ein kleines Compilerprojekt arbeiten wir gerade an der Implementierung eines Compilers für eine Teilmenge von C, für die wir uns entschieden haben, Haskell und megaparsec zu verwenden. Insgesamt haben wir gute Fortschritte gemacht, aber es gibt noch einige Eckfälle, die wir noch nicht richtig handhaben können. Einer von ihnen ist die Behandlung von Backslashes gefolgt von einem Newline. Um aus der Spezifikation zu zitieren:

  

Jede Instanz eines Backslash-Zeichens () unmittelbar gefolgt von a   Das Zeichen für neue Zeilen wird gelöscht, und es werden physische Quellzeilen zum Bilden verbunden   logische Quellzeilen. Nur der letzte Backslash einer physischen Quelle   Linie ist berechtigt, Teil eines solchen Spleißes zu sein.   (§5.1.1., ISO / IEC9899: 201x)

Bisher haben wir zwei mögliche Ansätze für dieses Problem gefunden:

1.) Implementieren Sie eine Pre-Lexing-Phase, in der die ursprüngliche Eingabe reproduziert wird und jedes Auftreten von \\n entfernt wird. Der große Nachteil, den wir in diesem Ansatz sehen, ist, dass wir genaue Fehlerorte verlieren, die wir brauchen.

2.) Implementieren Sie einen speziellen char' -Kombinator, der sich wie char verhält, aber einen zusätzlichen Charakter voraus sieht und alle \\n stillschweigend konsumiert. Dies würde uns korrekte Positionen geben. Der Nachteil hier ist, dass wir jedes Vorkommen von char mit char' in jedem Parser ersetzen müssen, sogar in den megaparsec-bereitgestellten wie string , integer , whitespace usw. ...

Wahrscheinlich sind wir nicht die ersten Leute, die versuchen, eine Sprache mit solch einer "Eigenart" mit Parsec / megaparsec zu analysieren, also könnte ich mir vorstellen, dass es einen schöneren Weg gibt, es zu tun. Hat jemand eine Idee?

    
Chirs 02.11.2017, 21:58
quelle

0 Antworten