Редактор с проверкой синтаксиса написания (Помогите с идеей о реализации редактора с проверкой синтаксиса)

Модератор: Модераторы разделов

Аватара пользователя
OwnerCoder
Сообщения: 186
ОС: OpenSuSe 11, Apple OS X 10.5.8

Редактор с проверкой синтаксиса написания

Сообщение OwnerCoder »

Люди хелп,
ни чего не приходит в голову, необходимо разработать редактор с проверкой правильности написания синтаксиса c++ кода.
Чем можно реализовать данную проверку? Я думал по поводу регексов, но будет ли это правильным решением, или же есть другие способо?
Так же не смог найти примеры составленных регексов для сего сабжа. Помогите с идеей о реализацие.
Спасибо сказали:
Аватара пользователя
Фантом
Сообщения: 463
ОС: openSUSE

Re: Редактор с проверкой синтаксиса написания

Сообщение Фантом »

OwnerCoder писал(а):
16.02.2009 23:52
Люди хелп,
ни чего не приходит в голову, необходимо разработать редактор с проверкой правильности написания синтаксиса c++ кода.

Это не совсем ответ на вопрос, но все же...

Есть такая древняя шутка - любая случайная последовательность символов является синтаксически корректной программой на C. :) Это утверждение не так уж далеко ушло от правды (причем к C++ оно тоже относится).

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

Короче говоря - Вы действительно уверены, что Вам необходимо это разработать?
Спасибо сказали:
Аватара пользователя
OwnerCoder
Сообщения: 186
ОС: OpenSuSe 11, Apple OS X 10.5.8

Re: Редактор с проверкой синтаксиса написания

Сообщение OwnerCoder »

Фантом писал(а):
17.02.2009 00:07
OwnerCoder писал(а):
16.02.2009 23:52
Люди хелп,
ни чего не приходит в голову, необходимо разработать редактор с проверкой правильности написания синтаксиса c++ кода.

Это не совсем ответ на вопрос, но все же...

Есть такая древняя шутка - любая случайная последовательность символов является синтаксически корректной программой на C. :) Это утверждение не так уж далеко ушло от правды (причем к C++ оно тоже относится).

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

Короче говоря - Вы действительно уверены, что Вам необходимо это разработать?


Честно говоря да, это что то вроде лабы для института, но здесь меня эта лаба заинтересовала самого. Тоесть вы хотите предложить словарь типа:

Код: Выделить всё

%type% %var%;
void %funcName%(%params%);
%var% = %value%;

Я правильно понял? Правда написал грубый пример.
Спасибо сказали:
Аватара пользователя
Фантом
Сообщения: 463
ОС: openSUSE

Re: Редактор с проверкой синтаксиса написания

Сообщение Фантом »

OwnerCoder писал(а):
17.02.2009 00:38
Честно говоря да, это что то вроде лабы для института, но здесь меня эта лаба заинтересовала самого. Тоесть вы хотите предложить словарь типа:

Код: Выделить всё

%type% %var%;
void %funcName%(%params%);
%var% = %value%;

Я правильно понял? Правда написал грубый пример.

Да, примерно так. Но в него придется включить и все зарезервированные слова языка. К тому же разбор объявлений в C++ - это тоже "еще та" задача.
Спасибо сказали:
Аватара пользователя
Voice
Сообщения: 1073
Статус: столлманист
ОС: Debian GNU/Linux

Re: Редактор с проверкой синтаксиса написания

Сообщение Voice »

Фантом писал(а):
17.02.2009 00:07
Отсюда вывод - это, вообще говоря, очень нетривиальная задача. Не буду утверждать наверняка, но очень сильно сомневаюсь, что она вообще решаема (так, чтобы это решение имело смысл - проверка при компиляции уже готового исходника, естественно, не рассматривается).

Решается вполне. Никогда не работали в ИДЕ на подобии Еклипса?
"И может собственных Платонов и быстрых разумом Невтонов российская земля рождать."
М. В. Ломоносов
Спасибо сказали:
Аватара пользователя
OwnerCoder
Сообщения: 186
ОС: OpenSuSe 11, Apple OS X 10.5.8

Re: Редактор с проверкой синтаксиса написания

Сообщение OwnerCoder »

Voice писал(а):
17.02.2009 02:12
Решается вполне. Никогда не работали в ИДЕ на подобии Еклипса?

Конечно работал, я хотел сначала QtCreator разбирать, но потом начал искать сорцы, а сорцы вроде лежат на rsync. Поэтому временно забил на сорцы.

Фантом: может тогда лучьше будет регексы состовлять пытаться, для таких вещей, а чуть не забыл, после того как у мну база/словарь будет готов, я строчку проверяю на соответствие с каждым выражением в словаре так я понял или есть более быстрый способ?
Спасибо сказали:
Аватара пользователя
Portnov
Модератор
Сообщения: 1786
Статус: Матёрый линуксоид
ОС: Debian testing/unstable

Re: Редактор с проверкой синтаксиса написания

Сообщение Portnov »

Насколько я понимаю, такие штуки в том же eclipse построены на конечных автоматах. Ключевые слова: конечные автоматы, формальные грамматики, лексический анализатор, синтаксический анализатор (в eclipse, насколько я понимаю, работает только лексический).
Работа: Ubuntu 9.10
Дом: Debian testing/unstable и на всякий случай winxp в virtualbox.
Для разнообразия: моя домашняя страница -http://iportnov.ru
Спасибо сказали:
Аватара пользователя
OwnerCoder
Сообщения: 186
ОС: OpenSuSe 11, Apple OS X 10.5.8

Re: Редактор с проверкой синтаксиса написания

Сообщение OwnerCoder »

Portnov писал(а):
17.02.2009 08:56
Насколько я понимаю, такие штуки в том же eclipse построены на конечных автоматах. Ключевые слова: конечные автоматы, формальные грамматики, лексический анализатор, синтаксический анализатор (в eclipse, насколько я понимаю, работает только лексический).

Вот приблизительно по такому виду делается лексический анализ?

Код: Выделить всё

 class tokenstream {
   // Входной поток
   private $input_stream;
   // Указатель позиции во входном потоке
   public $seek = 0;
   // Конструктор
   public function __construct ( $input ) {
      // Инициализируем входной поток
      $this -> input_stream = $input;
   }
   // Возвращает очередной символ из входного потока
   public function readChar ( ) {
      $char = ( isset ( $this -> input_stream [ $this -> seek ] ) ? $this -> input_stream [ $this -> seek ] : false );
      $this -> seek++;
      return $char;
   }
   // Производит токенизацию
   public function tokenize ( ) {
      $output = array ( );
      while ( ( $char = $this -> readChar ( ) ) !== false ) {
         if ( preg_match ( '/\s/', $char ) ) { // Неотображаемые символы
         } elseif ( preg_match ( '/\"/', $char ) ) { // Кавычки
            $output [ ] = 'T_QUOTE';
         } elseif ( условие ) {
            $output [ ] = 'T_...';
         }
      }
      return $output;
   }
 }
 // Исходный код для разбора
 $my_source = '
  function foo ( ) {
   $my_var = "foo-bar";
  }
 ';
 // Создаем экземпляр класса парсера
 $tokenstream = new tokenstream ( $my_source );
 // Парсим исходный код и распечатываем результат
 print_r ( $tokenstream -> tokenize ( ) );

Пример на php в консоле выдает след.:

Код:

owner@linux-jsrt:~/projects> ./parser.php PHP Notice: Use of undefined constant условие - assumed 'условие' in /home/owner/projects/parser.php on line 27 PHP Notice: Use of undefined constant условие - assumed 'условие' in /home/owner/projects/parser.php on line 27 PHP Notice: Use of undefined constant условие - assumed 'условие' in /home/owner/projects/parser.php on line 27 PHP Notice: Use of undefined constant условие - assumed 'условие' in /home/owner/projects/parser.php on line 27 PHP Notice: Use of undefined constant условие - assumed 'условие' in /home/owner/projects/parser.php on line 27 PHP Notice: Use of undefined constant условие - assumed 'условие' in /home/owner/projects/parser.php on line 27 PHP Notice: Use of undefined constant условие - assumed 'условие' in /home/owner/projects/parser.php on line 27 PHP Notice: Use of undefined constant условие - assumed 'условие' in /home/owner/projects/parser.php on line 27 PHP Notice: Use of undefined constant условие - assumed 'условие' in /home/owner/projects/parser.php on line 27 PHP Notice: Use of undefined constant условие - assumed 'условие' in /home/owner/projects/parser.php on line 27 PHP Notice: Use of undefined constant условие - assumed 'условие' in /home/owner/projects/parser.php on line 27 PHP Notice: Use of undefined constant условие - assumed 'условие' in /home/owner/projects/parser.php on line 27 PHP Notice: Use of undefined constant условие - assumed 'условие' in /home/owner/projects/parser.php on line 27 PHP Notice: Use of undefined constant условие - assumed 'условие' in /home/owner/projects/parser.php on line 27 PHP Notice: Use of undefined constant условие - assumed 'условие' in /home/owner/projects/parser.php on line 27 PHP Notice: Use of undefined constant условие - assumed 'условие' in /home/owner/projects/parser.php on line 27 PHP Notice: Use of undefined constant условие - assumed 'условие' in /home/owner/projects/parser.php on line 27 PHP Notice: Use of undefined constant условие - assumed 'условие' in /home/owner/projects/parser.php on line 27 PHP Notice: Use of undefined constant условие - assumed 'условие' in /home/owner/projects/parser.php on line 27 PHP Notice: Use of undefined constant условие - assumed 'условие' in /home/owner/projects/parser.php on line 27 PHP Notice: Use of undefined constant условие - assumed 'условие' in /home/owner/projects/parser.php on line 27 PHP Notice: Use of undefined constant условие - assumed 'условие' in /home/owner/projects/parser.php on line 27 PHP Notice: Use of undefined constant условие - assumed 'условие' in /home/owner/projects/parser.php on line 27 PHP Notice: Use of undefined constant условие - assumed 'условие' in /home/owner/projects/parser.php on line 27 PHP Notice: Use of undefined constant условие - assumed 'условие' in /home/owner/projects/parser.php on line 27 PHP Notice: Use of undefined constant условие - assumed 'условие' in /home/owner/projects/parser.php on line 27 PHP Notice: Use of undefined constant условие - assumed 'условие' in /home/owner/projects/parser.php on line 27 PHP Notice: Use of undefined constant условие - assumed 'условие' in /home/owner/projects/parser.php on line 27 PHP Notice: Use of undefined constant условие - assumed 'условие' in /home/owner/projects/parser.php on line 27 PHP Notice: Use of undefined constant условие - assumed 'условие' in /home/owner/projects/parser.php on line 27 PHP Notice: Use of undefined constant условие - assumed 'условие' in /home/owner/projects/parser.php on line 27 Array ( [0] => T_... [1] => T_... [2] => T_... [3] => T_... [4] => T_... [5] => T_... [6] => T_... [7] => T_... [8] => T_... [9] => T_... [10] => T_... [11] => T_... [12] => T_... [13] => T_... [14] => T_... [15] => T_... [16] => T_... [17] => T_... [18] => T_... [19] => T_... [20] => T_... [21] => T_... [22] => T_QUOTE [23] => T_... [24] => T_... [25] => T_... [26] => T_... [27] => T_... [28] => T_... [29] => T_... [30] => T_QUOTE [31] => T_... [32] => T_... )


Что это еще за русские буквы в условиях???
Спасибо сказали:
Аватара пользователя
Portnov
Модератор
Сообщения: 1786
Статус: Матёрый линуксоид
ОС: Debian testing/unstable

Re: Редактор с проверкой синтаксиса написания

Сообщение Portnov »

Эмм... Вы этот код хотя бы читали? :)
Работа: Ubuntu 9.10
Дом: Debian testing/unstable и на всякий случай winxp в virtualbox.
Для разнообразия: моя домашняя страница -http://iportnov.ru
Спасибо сказали:
allez
Сообщения: 2223
Статус: Не очень злой админ :-)
ОС: SuSE, CentOS, FreeBSD, Windows

Re: Редактор с проверкой синтаксиса написания

Сообщение allez »

Portnov, тут, похоже имеет место ситуация вида "чукча не читатель, чукча писатель". :)

OwnerCoder, подскажу: просмотрите внимательнее функцию tokenize(). ;)
А еще вам английским по экрану написано:
PHP Notice: Use of undefined constant условие - assumed 'условие' in /home/owner/projects/parser.php on line 27
Что там у вас в строке 27? :)
Спасибо сказали:
Аватара пользователя
OwnerCoder
Сообщения: 186
ОС: OpenSuSe 11, Apple OS X 10.5.8

Re: Редактор с проверкой синтаксиса написания

Сообщение OwnerCoder »

allez писал(а):
17.02.2009 11:51
Portnov, тут, похоже имеет место ситуация вида "чукча не читатель, чукча писатель". :)

OwnerCoder, подскажу: просмотрите внимательнее функцию tokenize(). ;)
А еще вам английским по экрану написано:
PHP Notice: Use of undefined constant условие - assumed 'условие' in /home/owner/projects/parser.php on line 27
Что там у вас в строке 27? :)


Блин читал я код, для этого я и написал в предыдущем посте:
Что это еще за русские буквы в условиях???

Ошибку я заметил но что это за "условие", кто дадумался его писать и что должно происходить по идеи :)
Вы че народ по вашему читать не умею? Меня самого это поразило :) (Кстати статья была с википедии)
Лексический_анализ
Спасибо сказали:
Аватара пользователя
Luinnar
Сообщения: 246
ОС: Solaris, Debian, Ubuntu

Re: Редактор с проверкой синтаксиса написания

Сообщение Luinnar »

В VIMе как раз через regexp'ы код и подсвечивается. Файл с описанием синтаксиса всего на 360 строк (включая пробелы и всё такое). :)
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Спасибо сказали:
allez
Сообщения: 2223
Статус: Не очень злой админ :-)
ОС: SuSE, CentOS, FreeBSD, Windows

Re: Редактор с проверкой синтаксиса написания

Сообщение allez »

OwnerCoder писал(а):
17.02.2009 13:22
Блин читал я код, для этого я и написал в предыдущем посте:
Что это еще за русские буквы в условиях???

Ошибку я заметил но что это за "условие", кто дадумался его писать и что должно происходить по идеи
Вы че народ по вашему читать не умею? Меня самого это поразило (Кстати статья была с википедии)

А вы попробуйте кроме чтения еще и думать. ;)
Давайте разберем эту конструкцию:

Код: Выделить всё

} elseif ( условие ) {
    $output [ ] = 'T_...';

В переводе на русский это означает примерно следующее: "иначе, если выполняется какое-то условие, присвоить переменной $output какое-то значение". В общем, автор примера показал, как обрабатывать кавычки и дал понять, что дальше, мол, пишите сами. :)

P. S. И да, поскольку фраза "Что это еще за русские буквы в условиях???" находится в вашем посте после вывода сообщений об ошибках, а не после исходного текста, то ее было несколько затруднительно отнести к коду.
Спасибо сказали:
Аватара пользователя
Фантом
Сообщения: 463
ОС: openSUSE

Re: Редактор с проверкой синтаксиса написания

Сообщение Фантом »

Voice писал(а):
17.02.2009 02:12
Решается вполне. Никогда не работали в ИДЕ на подобии Еклипса?

Работал. Но не назвал бы это "решается". :(
Спасибо сказали:
Аватара пользователя
OwnerCoder
Сообщения: 186
ОС: OpenSuSe 11, Apple OS X 10.5.8

Re: Редактор с проверкой синтаксиса написания

Сообщение OwnerCoder »

Слил исходник QtCreator, нашел там модуль который отвечает за проверку кода, теперь буду разбираться. Потом отпишусь :)
Спасибо сказали: