LINUX.ORG.RU

История изменений

Исправление tp_for_my_bunghole, (текущая версия) :

Просто интересно - создание каких инструментов невозможно для Си?

Всё что связано с IDE.
Для начала нужно получить информацию о том что вообще компилируется. Какие файлы? В какой последовательности? Какие определения препроцессора активны и в каких частях кода?

Статически получить эту информацию невозможно. Вся этa информация содержится в разных системах сборки проектов.
Единственный правильный подход это назвать программу анализатор именем компилятора(soft link) и пропустить компиляцию проекта через этот анализатор который вместо компиляции будет собирать всю информацию в процессе.
Так делает RTags. Но в RTags ещё есть режим который анализирует stdout во время компиляции, где ищет с помощью regexp строки которые напоминают строку вызова компилятора(gcc, cc, опции), потом использует средства CLang. Так же должно быть работает и Netbeans для C но без CLang.

Проекты могут компилироваться и несколько часов.
Aнализаторы приходится делать с хаком для typedef, во время парсинга передавать в лексер информацию о всех встреченных typedef в коде. Иначе невозможно отличить имя переменной от псевдонима типа(typedef), все встреченные typedef должны накапливаться в отдельном массиве, и лексер проверяет этот массив когда встречает любое название в коде, если этот символ есть в массиве накопленных typedef'ов, значит это не токен имени переменной а название типа.
https://en.wikipedia.org/wiki/The_lexer_hack

Исправление tp_for_my_bunghole, :

Просто интересно - создание каких инструментов невозможно для Си?

Всё что связано с IDE.
Для начала нужно получить информацию о том что вообще компилируется. Какие файлы? В какой последовательности? Какие определения препроцессора активны и в каких частях кода?

Статически получить эту информацию невозможно. Вся этa информация содержится в разных системах сборки проектов.
Единственный правильный подход это назвать программу анализатор именем компилятора(soft link) и пропустить компиляцию проекта через этот анализатор который вместо компиляции будет собирать всю информацию в процессе.
Так делает RTags. Но в RTags ещё есть режим который анализирует stdout во время компиляции, где ищет с помощью regexp строки которые напоминают строку вызова компилятора(gcc, cc, опции), потом использует средства CLang. Так же должно быть работает и Netbeans для C но без CLang.

Проекты могут компилироваться и несколько часов.
Статические анализаторы приходится делать с хаком для typedef, во время парсинга передавать в лексер информацию о всех встреченных typedef в коде. Иначе невозможно отличить имя переменной от псевдонима типа(typedef), все встреченные typedef должны накапливаться в отдельном массиве, и лексер проверяет этот массив когда встречает любое название в коде, если этот символ есть в массиве накопленных typedef'ов, значит это не токен имени переменной а название типа.
https://en.wikipedia.org/wiki/The_lexer_hack

Исходная версия tp_for_my_bunghole, :

Просто интересно - создание каких инструментов невозможно для Си?

Всё что связано с IDE.
Для начала нужно получить информацию о том что вообще компилируется. Какие файлы? В какой последовательности? Какие определения препроцессора активны и в каких частях кода?

Статически получить эту информацию невозможно. Всё этa информация содержится в разных системах сборки проектов.
Единственный правильный подход это назвать программу анализатор именем компилятора(soft link) и пропустить компиляцию проекта через этот анализатор который вместо компиляции будет собирать всю информацию в процессе.
Так делает RTags. Но в RTags ещё есть режим который анализирует stdout во время компиляции, где ищет с помощью regexp строки которые напоминают строку вызова компилятора(gcc, cc, опции), потом использует средства CLang. Так же должно быть работает и Netbeans для C но без CLang.

Проекты могут компилироваться и несколько часов.
Статические анализаторы приходится делать с хаком для typedef, во время парсинга передавать в лексер информацию о всех встреченных typedef в коде. Иначе невозможно отличить имя переменной от псевдонима типа(typedef), все встреченные typedef должны накапливаться в отдельном массиве, и лексер проверяет этот массив когда встречает любое название в коде, если этот символ есть в массиве накопленных typedef'ов, значит это не токен имени переменной а название типа.
https://en.wikipedia.org/wiki/The_lexer_hack