LINUX.ORG.RU

C++. Поверхностная проверка синтаксиса.

 ,


0

2

Поставил плагин Syntastic к Vim, хочу проверку синтаксиса моего C++ кода при сохранении. Поскольку проект для которого я пишу довольно сложный и громоздкий, хочется чтобы проверка синтаксиса осуществлялась только в текущем файле, без подключения include'ов и выполнялась «сквозь пальцы». Достаточно будет проверить, что код структурно правильный, не вдаваясь в смысл имён.

Например:

  • «FakeType var = val;» - правильная строка, даже если FakeType не определен в текущем файле
  • «func(a, b c);» - неправильная строка, поскольку пропущена запятая

Я пробовал:

  • gcc -fsyntax-only - не смог настроить его на поверхностную проверку. Всё равно подключает include'ы и сопоставляет имена
  • cppcheck - вообще почти ничего не умеет

Что ещё можно попробовать или как настроить gcc?

В языках с контекстно-зависимой грамматикой в общем случае это нереально. Enjoy your cpp.

mix_mix ★★★★★
()
Ответ на: комментарий от clojure

Я выставлял эти опции - никакого эффекта. Решил, что недопонял чего-то.

tri10bit
() автор топика
Ответ на: комментарий от MyTrooName

Нет, проблема не в поиске файлов, а в поиске имен. Если я просто отключу incude'ы, то будет только больше ошибок про неизвестные имена.

tri10bit
() автор топика
Ответ на: комментарий от tri10bit

тогда другая идея: можно чекать контекстную грамматику. только ее надо сперва написать :)

зато сам можешь контролировать, насколько детальной должна быть проверка

MyTrooName ★★★★★
()

«func(a, b c);» - неправильная строка, поскольку пропущена запятая

Че это вдруг сразу неправильная?

#define b
...
func(a, b c);
kamre ★★★
()
Ответ на: комментарий от kamre

На макросы хочется забить. Такой код у меня не встречается.

Получается мне нужно приложение для ответита на вопрос - строится ли из данного текста синтаксическое дерево C++, игнорируя типы и директивы препроцессора.

tri10bit
() автор топика

«func(a, b c);» - неправильная строка, поскольку пропущена запятая

С какой такой радости? Ты не знаешь, как b и c определены.

Может, у тебя в инклюдах «#define b (void *)» где-то, например.

anonymous
()
Ответ на: комментарий от tri10bit

На макросы хочется забить.

Ну тогда ты один такой. Сам себе тулзу и пиши, никому кроме тебя подобное говно не нужно.

Такой код у меня не встречается.

Ты не умеешь в сишечку.

Получается мне нужно приложение для ответита на вопрос - строится ли из данного текста синтаксическое дерево C++, игнорируя типы и директивы препроцессора.

Нельзя построить синтаксическое дерево C++, игнорируя типы. Синтаксис неоднозначный, информация о типах необходима уже на этапе синтаксического разбора.

Я вообще не понял, тебе так жалко ничтожных миллисекунд на парсинг хедеров?

anonymous
()

Попробуй Ycm он правда разворачивается не очень кашерно, но работает получше. Хотя и не намного :)

batbko
()

Не вдаваясь в подробности: llvm со шлангом предлагали?

invy ★★★★★
()
Ответ на: комментарий от tri10bit

строится ли из данного текста синтаксическое дерево C++

игнорируя типы и директивы препроцессора

так ничего не получится. даже если ты честно обещаешь не пользоваться макросами, типы тебе разбирать придется, чтобы распарсить c++.

единственный проект с таким подходом, как ты хочешь, что я знаю — это http://coccinelle.lip6.fr/ .

но там только си, для c++ такое скорее всего просто бессмысленно делать.

anonymous
()

В общем я думал, что хочу чего-то простого, но похоже, что это не так :) В итоге настроил gcc. В корень каждой work copy буду класть конфиг с флагами и абслютными путями. Хочется это дело упростить, чтобы инклюды всегда искались относительно vim path, думаю со временем разберусь.

На первый взляд работает, посмотрим как покажет себя в деле. Тормоза при сохранении заметны, но не так критичны.

tri10bit
() автор топика
Ответ на: комментарий от tri10bit

Хотя я погорячился. Если редактировать код с smb шары, секунд 5 проверка идёт. :(

tri10bit
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.