2016-06-03 5 views
2

В основной плагин CDT, есть метод getRawSignature интерфейса IASTNode, который был описан как:
CDT IASTNode getRawSignature после препроцессора

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;" 

Но я хочу, чтобы получить строку подписи после узел обрабатывается препроцессор
В приведенном выше примере ожидаемая строка: int x=1
Как получить эту строку? Я посмотрел на некоторые другие методы, но никто не может.

ответ

2

Отличный вопрос!

Первое, что нужно отметить, это то, что во время обработки CDT код не существует в форме предварительно обработанной строки.

Поток обработки заключается в следующем:

Unpreprocessed string 
-> [Lexer] 
-> Unpreprocessed token stream 
-> [Preprocessor] 
-> Preprocessed token stream 
-> [Parser] 
-> Abstract syntax tree 

Обратите внимание, что в препроцессированной форме, код существует только в качестве маркеров потока, а не в виде строки.

При этом, если бы у вас был предварительно обработанный токен, вы, вероятно, могли бы использовать его для построения предварительно обработанной строки.

К сожалению, я не знаю, как легко получить предварительно обработанные жетоны, и this mailing list thread предполагает, что их может не быть.

Ближе всего я думаю, что мы можем прийти, чтобы повторно обработать файл и тем самым получить предварительно обработанный токен для всего файла. Это можно сделать, вызвав AbstractCLikeLanguage.createScanner(), чтобы получить IScanner (это защищенный метод, поэтому вам нужно будет получить от GCCLanguage или GPPLanguage) и вызывать IScanner.nextToken() несколько раз, чтобы получить предварительно обработанные жетоны.

Это все еще не дает вам то, что вы хотите, поскольку вам нужны предварительно обработанные токены, соответствующие конкретному узлу AST. I верьте, вы можете вычислить это, сравнив смещение и длину предварительно обработанных жетонов (полученных с использованием IToken.getOffset() и IToken.getLength()) со смещением и длиной узла AST (полученных с использованием и), которые, как я полагаю, имеют одинаковую нумерацию пространство.