Wie werden Kommentare in Programmiersprachengrammatiken ausgedrückt?

8

Ich lerne, wie man Parser mit Grammatiken erstellt, aber ich habe versucht, Kommentare auszudrücken, weil sie fast überall erscheinen können.

Dies zeigt an, dass Kommentare aus dem Token-Stream entfernt werden können, bevor das Parsen stattfindet.

Ist das die Standardpraxis oder werden Kommentare jemals / oft in Grammatiken angegeben?


quelle
"Sie können fast überall auftreten" ist eine gewisse Strecke. Es gibt einige Sprachen, die nur Kommentare zwischen Anweisungen zulassen.
MSalters
1
Ein Beispiel für eine Sprache, in der die Kommentare vor dem Parsen NICHT entfernt werden, finden Sie unter TCL. Die Kommentare sind Teil der Grammatik. Wenn Sie sie an der falschen Stelle platzieren, können Sie erwarten, dass der Parser Sie anschreit.
Michael Kohne
@Michael Ich kann jedoch keine Grammatik für TCL finden: Diese Seite scheint darauf hinzuweisen, dass es keine statische gibt.
1
@ MattFenwick - gute Soße. Ich wusste nicht, dass es so formbar ist. Laut dem, was das sagt, kann man kein TCL-Grammatiker haben, es macht keinen Sinn. Ich hatte keine Ahnung, entschuldige die falsche Spur.
Michael Kohne

Antworten:

2

Es ist sehr üblich, es als eine Form von Leerraum zu behandeln. Ähnlich wie Zeilenumbrüche in semikolonorientierten Sprachen wie C.

Sobald es sich um eine Art Leerraum handelt, ignorieren Sie ihn häufig höher im Parser.


quelle
17

Sie sind normalerweise nicht.

Sie werden vom Lexer entfernt, wenn der Quellcode von Zeichen in Token umgewandelt wird.

Dann erhält der Parser Token und erstellt einen AST. Wenn der Parser seine Arbeit erledigt, sind Kommentare bereits verschwunden, sodass sie nicht in der Grammatik erscheinen müssen.

deadalnix
quelle
5

Kurze kurze Antwort

Ja, es ist die Standardpraxis, Kommentare im "Lexer" oder "Parser" zu erkennen.

Manchmal hat der "Parser" einen eingebauten "Lexer" oder wird mit dem "Parser" als einzelnes Tool ("Lexer-Parser") gemischt.

Erweiterte Antwort

Ich arbeite nur in diesem Fall.

Die meisten "Scanner" (auch als "Tokenizer" oder "Lexer" bekannt) erkennen Kommentare, werden jedoch entfernt, wenn Token an den "Parser" zurückgegeben werden.

Manchmal verwendet eine Programmiersprache einige Kommentare mit einer besonderen Bedeutung, z. B. "Compiler-Direktiven" oder "Dokumentation".

Beispiel für einen Standardkommentar:

/*
 This function does something cool.
*/
int doSomething()
{
  return 0;
}

Beispiel für einen Richtungskommentar:

/*
 ##override
*/
int doSomething()
{
  return 0;
}

Kommentar zum Dokumentationsgenerator Beispiel:

/*
 @description: This Function text will be turn,
  into an external pdf file, togheter with other
  similar comments.
*/
int doSomething()
{
  return 0;
}

Die meisten Compiler-Tools erkennen diese speziellen Kommentare mit einem Analysator oder Präprozessor, der nicht der Hauptlexer oder Parser ist und sogar einen eigenen kleinen Lexer hat.

Prost.

umlcat
quelle
0

Einige Parser, die Kommentare und / oder unzulässige Eingaben im AST beibehalten, fügen sie allen Knoten des AST als Eigenschaften hinzu.

Sie können sich das Microsoft Roslyn-Projekt ansehen, das dies tut, wenn ich mich richtig erinnere.

Patrick
quelle