Große Frage!
Die erste Sache zu beachten ist, dass zu keinem Zeitpunkt während CDT Verarbeitung Code in Form einer vorverarbeiteten Zeichenfolge existiert.
Der Verarbeitungsablauf ist folgender:
Unpreprocessed string
-> [Lexer]
-> Unpreprocessed token stream
-> [Preprocessor]
-> Preprocessed token stream
-> [Parser]
-> Abstract syntax tree
Beachten Sie, dass in vorverarbeiteten Form, wird nur der Code als ein Tokenstrom vorhanden ist, nicht als eine Zeichenkette.
Das heißt, wenn Sie den vorverarbeiteten Token-Stream hatten, könnten Sie wahrscheinlich verwenden, um eine vorverarbeitete Zeichenfolge zu erstellen.
Leider ist mir keine einfache Möglichkeit bekannt, vorverarbeitete Token zu erhalten, und this mailing list thread schlägt vor, dass es möglicherweise keine gibt.
Die nächste, die ich denke, können wir erreichen, ist die Datei erneut vorzuverarbeiten und dadurch einen vorverarbeiteten Token-Stream für die gesamte Datei zu erhalten. Dies kann durch Aufruf von AbstractCLikeLanguage.createScanner()
zum Erhalt einer IScanner
(es ist eine geschützte Methode, so müssten Sie von GCCLanguage
oder GPPLanguage
, um darauf zuzugreifen), abgerufen werden, und Aufruf IScanner.nextToken()
wiederholt, um die vorverarbeiteten Token zu erhalten.
Das gibt Ihnen immer noch nicht ganz, was Sie wollen, da Sie vorverarbeitete Token entsprechend einem bestimmten AST-Knoten haben wollen. I glauben Sie dies durch den Vergleich der Offset berechnen kann und die Länge der vorverarbeiteten Tokens (erhalten unter Verwendung von IToken.getOffset()
und IToken.getLength()
) an die Offset und die Länge des AST-Knoten (erhalten unter Verwendung von ASTNode.getOffset()
und ASTNode.getLength()
), die ich in der gleichen Numerierung glauben Raum.