Отличный вопрос!
Первое, что нужно отметить, это то, что во время обработки 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 (полученных с использованием и), которые, как я полагаю, имеют одинаковую нумерацию пространство.