Анализ исходного файла C ++ после предварительной обработки - PullRequest
2 голосов
/ 03 мая 2011

Я пытаюсь проанализировать c++ файлы, используя мой собственный анализатор (написанный на c++).Перед началом разбора я бы хотел избавиться от всего #define.Я хочу, чтобы исходный файл был компилируемым после предварительной обработки.Поэтому лучшим способом будет запустить файл C Preprocessor.

cpp myfile.cpp temp.cpp
// or
g++ -E myfile.cpp > templ.cpp

[Новые предложения приветствуются.]

Но из-за этого исходные строки и их номера строк будутпотеряно, поскольку файл будет содержать всю информацию заголовка также, и я хочу сохранить номера строк.Итак, выход, который я решил, это:

  1. Добавить специальный символ перед каждой строкой в ​​исходном файле (кроме препроцессоров)
  2. Запустить препроцессор
  3. Извлечьстроки с этим специальным символом и проанализируйте их

Например, типичный исходный файл будет выглядеть следующим образом:

#include<iostream>
#include"xyz.h"
int x;    
#define SOME value
/*
**  This is a test file
*/
typedef char* cp;

void myFunc (int* i, ABC<int, X<double> > o)
{
  //...
}

class B {
};

После добавления символа он будет выглядеть так:

#include<iostream>
#include"xyz.h"
@3@int x;    
#define SOME value
@5@/*
@6@**  This is a test file
@7@*/
@8@typedef char* cp;
@9@
@10@void myFunc (int* i, ABC<int, X<double> > o)
@11@{
@12@  //...
@13@}
@14@
@15@class B {
@16@};

Как только все макросы и комментарии будут удалены, у меня останутся тысячи строк, в которых несколько сотен будут исходным исходным кодом.

Правильный ли этот подход?Я пропустил какой-нибудь угловой шкаф?

Ответы [ 2 ]

3 голосов
/ 03 мая 2011

Вы понимаете, что g ++ -E добавляет к выводу несколько своих собственных строк, которые указывают номера строк в исходном файле?Вы найдете строки типа

# 2 "foo.cc" 2

, которые указывают, что вы смотрите на строку 2 файла foo.cc.Эти строки вставляются всякий раз, когда нарушается обычная последовательность строк.

1 голос
/ 03 мая 2011

Программа imake, которая раньше шла с источниками X11, использовала слегка похожую систему, помечая концы строк @@, чтобы она могла должным образом обрабатывать их.

Вывод gcc -E обычно включает в себя #line директивы;Вы могли бы использовать их вместо своих символов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...