Ergebnis 1 bis 3 von 3

Thema: [sablecc] Verschachtelte Block-Kommentare parsen

  1. #1

    [sablecc] Verschachtelte Block-Kommentare parsen

    Hallo,

    meine Chancen stehen vielleicht sonderlich gut hier jemanden zu finden, der sich mit sablecc auskennt, aber vielleicht kann mir ja doch jemand helfen.

    Ich muss aktuell für die Uni einen Parser für eine kleine Programmiersprache (H3) schreiben (Abgabe bis nächsten Dienstag), wofür ich (wie empfohlen) sablecc verwende. Mittlerweile habe ich alle Konstrukte der Sprache abgedeckt mit einer Ausnahme:
    Geschachtelte Block-Kommentare.
    Code:
    {- Das ist hier ist ein normaler Blockkommentar
    den der Lexer erkennt und der Parser ignoriert -}
    
    ....
    {- Das hier ist ein 
        {- geschachtelter Blockkommentar -}
       der nicht korrekt erkannt wird -}
    Momentan arbeite ich bei sablecc zur Erkennung der Blockkommentare mit States. Beim erkennen von '{-' wechselt der Lexer von normal in block_comment modus und beim erkennen von '-}' von block_comment wieder in den normal-modus.
    Der entsprechende Teil der sable-datei sieht dabei so aus:
    Code:
     Tokens
    {line_comment->normal} line_end = 10 | 13;
    {line_comment, block_comment}  any_token = any_char;
    {normal->line_comment} line_comment_start = '--';
    {normal->block_comment} block_comment_start = '{-';
    {block_comment->normal} block_comment_end = '-}';
    Das Problem ist, wenn ich versuche den Block-Kommentar als ein ganzes Token zu matchen, kann ich nicht garantieren dass mit dem Block-Ende der Lexer auch wirklich das Token beendet, da ich ja zwischen den Block-Zeichen jedes Zeichen (und damit eben auch die beiden zeichen, die für die block-kommentare zuständig sind) haben kann.
    De facto bräuchte ich einen Zähler für die Tiefe des Block-Kommentars, die Frage ist ob sable mir so etwas in der Eingabe-datei erlaubt und wenn ja wie. Die einzige Alternative die ich sonst momentan habe wäre die von sable erzeugte Parserklasse diesbezüglich umzuschreiben, was ich wirklich ungern täte.
    Weiß jemand zufällig wie so etwas in sable funktioniert, oder welche anderen Ansätze erfolgsversprechend sein könnten? Bin hier momentan wirklich überfragt.

  2. #2
    Sicher, dass das so gewollt ist? Mir ist auf Anhieb keine Sprache bekannt, die geschachtelte Kommentare in der Form, wie du sie beschrieben hast, mitmacht.

  3. #3
    Ja sicher. Der Referenzparser (Musterlösung) parst verschachtelte Blockkommentare problemlos und im Testskript ist eine Eingabe mit verschachtelten Blockkommentaren drin.
    Viele Sprachen erlauben es zwar (wohl aus gutem Grund) nicht, aber nachdem sie etliche Schwierigkeiten des letzten Jahres (dangling else zB.) eliminiert haben, haben sie wohl gedacht irgend etwas kniffliges sollte doch noch drin sein.

    Andererseits habe ich mittlerweile in der Orginalarbeit zu sablecc einen Abschnitt gefunden wo der Autor erklärt wie man verschachtelte Blockkommentare parst. Man muss zwar den Lexer ein wenig erweitern, aber nicht großartig rumfummeln.

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •