Ich bin ein Delphi-Code-Parser mit Parsec, meine aktuellen AST Datenstrukturen wie folgt aussehen zu schreiben:Wie kann ich mit Kommentaren in meinem AST umgehen?
module Text.DelphiParser.Ast where
data TypeName = TypeName String [String] deriving (Show)
type UnitName = String
data ArgumentKind = Const | Var | Out | Normal deriving (Show)
data Argument = Argument ArgumentKind String TypeName deriving (Show)
data MethodFlag = Overload | Override | Reintroduce | Static | StdCall deriving (Show)
data ClassMember =
ConstField String TypeName
| VarField String TypeName
| Property String TypeName String (Maybe String)
| ConstructorMethod String [Argument] [MethodFlag]
| DestructorMethod String [Argument] [MethodFlag]
| ProcMethod String [Argument] [MethodFlag]
| FunMethod String [Argument] TypeName [MethodFlag]
| ClassProcMethod String [Argument] [MethodFlag]
| ClassFunMethod String [Argument] TypeName [MethodFlag]
deriving (Show)
data Visibility = Private | Protected | Public | Published deriving (Show)
data ClassSection = ClassSection Visibility [ClassMember] deriving (Show)
data Class = Class String [ClassSection] deriving (Show)
data Type = ClassType Class deriving (Show)
data Interface = Interface [UnitName] [Type] deriving (Show)
data Implementation = Implementation [UnitName] deriving (Show)
data Unit = Unit String Interface Implementation deriving (Show)
ich Kommentare in meinem AST Datenstrukturen beibehalten werden sollen und ich bin zur Zeit, um herauszufinden, wie zu tun Dies.
Mein Parser ist in einen Lexer und einen Parser aufgeteilt (beide mit Parsec geschrieben) und ich habe bereits das Lexing von Kommentartokens implementiert.
unit SomeUnit;
interface
uses
OtherUnit1, OtherUnit2;
type
// This is my class that does blabla
TMyClass = class
var
FMyAttribute: Integer;
public
procedure SomeProcedure;
{ The constructor takes an argument ... }
constructor Create(const Arg1: Integer);
end;
implementation
end.
Der Token-Stream sieht wie folgt aus:
[..., Type, LineComment " This is my class that does blabla", Identifier "TMyClass", Equals, Class, ...]
Der Parser dies schlägt sich in:
Class "TMyClass" ...
Die Class
Datentyp hat keine Möglichkeit, Kommentare zu befestigen und seit Kommentare (vor allem Blockkommentare) könnte fast überall im Token-Stream erscheinen Ich müsste einen optionalen Kommentar zu allen Datentypen in der AST hinzufügen?
Wie kann ich mit Kommentaren in meinem AST umgehen?
Siehe auch http://StackOverflow.com/questions/9392546/pretty-print-haskell-source-code-with-comments und überprüfen Sie, wie diese ASTs definiert sind. Zum Beispiel http://hackage.haskell.org/package/haskell-src-exts-1.16.0.1/docs/Language-Haskell-Extens-Annotated-Syntax.html ist in der Annotation polymorph. – d8d0d65b3f7cf42