2016-06-03 8 views
2

In CDT Core-Plugin gibt es eine Methode getRawSignature der Schnittstelle IASTNode, die wie beschrieben wurde:
CDT IASTNode getRawSignature nach Präprozessor

Returns the raw signature of the IASTNode before it is processed by the preprocessor. 
Example: 
#define ONE 1 
int x=ONE; // getRawSignature() for this declaration would return "int x=ONE;" 

Aber ich will die String Unterschrift nach der Knoten durch verarbeitet erhalten der Präprozessor
In dem obigen Beispiel lautet die erwartete Zeichenfolge: int x=1
Wie erhält man diese Zeichenfolge? Ich habe mir andere Methoden angeschaut, aber niemand kann es.

Antwort

2

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.