Редактор с проверкой синтаксиса написания (Помогите с идеей о реализации редактора с проверкой синтаксиса)
Модератор: Модераторы разделов
-
OwnerCoder
- Сообщения: 186
- ОС: OpenSuSe 11, Apple OS X 10.5.8
Редактор с проверкой синтаксиса написания
Люди хелп,
ни чего не приходит в голову, необходимо разработать редактор с проверкой правильности написания синтаксиса c++ кода.
Чем можно реализовать данную проверку? Я думал по поводу регексов, но будет ли это правильным решением, или же есть другие способо?
Так же не смог найти примеры составленных регексов для сего сабжа. Помогите с идеей о реализацие.
ни чего не приходит в голову, необходимо разработать редактор с проверкой правильности написания синтаксиса c++ кода.
Чем можно реализовать данную проверку? Я думал по поводу регексов, но будет ли это правильным решением, или же есть другие способо?
Так же не смог найти примеры составленных регексов для сего сабжа. Помогите с идеей о реализацие.
-
Фантом
- Сообщения: 463
- ОС: openSUSE
Re: Редактор с проверкой синтаксиса написания
OwnerCoder писал(а): ↑16.02.2009 23:52Люди хелп,
ни чего не приходит в голову, необходимо разработать редактор с проверкой правильности написания синтаксиса c++ кода.
Это не совсем ответ на вопрос, но все же...
Есть такая древняя шутка - любая случайная последовательность символов является синтаксически корректной программой на C.
Отсюда вывод - это, вообще говоря, очень нетривиальная задача. Не буду утверждать наверняка, но очень сильно сомневаюсь, что она вообще решаема (так, чтобы это решение имело смысл - проверка при компиляции уже готового исходника, естественно, не рассматривается). Пожалуй, максимум, что можно сделать - проверять по словарю все, что похоже на идентификаторы функций или переменных, выкидывая сообщения "этот идентификатор не определен".
Короче говоря - Вы действительно уверены, что Вам необходимо это разработать?
-
OwnerCoder
- Сообщения: 186
- ОС: OpenSuSe 11, Apple OS X 10.5.8
Re: Редактор с проверкой синтаксиса написания
Фантом писал(а): ↑17.02.2009 00:07OwnerCoder писал(а): ↑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: Редактор с проверкой синтаксиса написания
Решается вполне. Никогда не работали в ИДЕ на подобии Еклипса?
"И может собственных Платонов и быстрых разумом Невтонов российская земля рождать."
М. В. Ломоносов
М. В. Ломоносов
-
OwnerCoder
- Сообщения: 186
- ОС: OpenSuSe 11, Apple OS X 10.5.8
Re: Редактор с проверкой синтаксиса написания
Конечно работал, я хотел сначала QtCreator разбирать, но потом начал искать сорцы, а сорцы вроде лежат на rsync. Поэтому временно забил на сорцы.
Фантом: может тогда лучьше будет регексы состовлять пытаться, для таких вещей, а чуть не забыл, после того как у мну база/словарь будет готов, я строчку проверяю на соответствие с каждым выражением в словаре так я понял или есть более быстрый способ?
-
Portnov
- Модератор
- Сообщения: 1786
- Статус: Матёрый линуксоид
- ОС: Debian testing/unstable
Re: Редактор с проверкой синтаксиса написания
Насколько я понимаю, такие штуки в том же eclipse построены на конечных автоматах. Ключевые слова: конечные автоматы, формальные грамматики, лексический анализатор, синтаксический анализатор (в eclipse, насколько я понимаю, работает только лексический).
Работа: Ubuntu 9.10
Дом: Debian testing/unstable и на всякий случай winxp в virtualbox.
Для разнообразия: моя домашняя страница -http://iportnov.ru
Дом: Debian testing/unstable и на всякий случай winxp в virtualbox.
Для разнообразия: моя домашняя страница -http://iportnov.ru
-
OwnerCoder
- Сообщения: 186
- ОС: OpenSuSe 11, Apple OS X 10.5.8
Re: Редактор с проверкой синтаксиса написания
Вот приблизительно по такому виду делается лексический анализ?
Код: Выделить всё
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: Редактор с проверкой синтаксиса написания
Эмм... Вы этот код хотя бы читали? :)
Работа: Ubuntu 9.10
Дом: Debian testing/unstable и на всякий случай winxp в virtualbox.
Для разнообразия: моя домашняя страница -http://iportnov.ru
Дом: Debian testing/unstable и на всякий случай winxp в virtualbox.
Для разнообразия: моя домашняя страница -http://iportnov.ru
-
allez
- Сообщения: 2223
- Статус: Не очень злой админ :-)
- ОС: SuSE, CentOS, FreeBSD, Windows
Re: Редактор с проверкой синтаксиса написания
Portnov, тут, похоже имеет место ситуация вида "чукча не читатель, чукча писатель". :)
OwnerCoder, подскажу: просмотрите внимательнее функцию tokenize(). ;)
А еще вам английским по экрану написано:
OwnerCoder, подскажу: просмотрите внимательнее функцию tokenize(). ;)
А еще вам английским по экрану написано:
Что там у вас в строке 27? :)PHP Notice: Use of undefined constant условие - assumed 'условие' in /home/owner/projects/parser.php on line 27
-
OwnerCoder
- Сообщения: 186
- ОС: OpenSuSe 11, Apple OS X 10.5.8
Re: Редактор с проверкой синтаксиса написания
allez писал(а): ↑17.02.2009 11:51Portnov, тут, похоже имеет место ситуация вида "чукча не читатель, чукча писатель".
OwnerCoder, подскажу: просмотрите внимательнее функцию tokenize().
А еще вам английским по экрану написано:Что там у вас в строке 27?PHP Notice: Use of undefined constant условие - assumed 'условие' in /home/owner/projects/parser.php on line 27
Блин читал я код, для этого я и написал в предыдущем посте:
Что это еще за русские буквы в условиях???
Ошибку я заметил но что это за "условие", кто дадумался его писать и что должно происходить по идеи
Вы че народ по вашему читать не умею? Меня самого это поразило
Лексический_анализ
-
Luinnar
- Сообщения: 246
- ОС: Solaris, Debian, Ubuntu
Re: Редактор с проверкой синтаксиса написания
В VIMе как раз через regexp'ы код и подсвечивается. Файл с описанием синтаксиса всего на 360 строк (включая пробелы и всё такое). 
У вас нет необходимых прав для просмотра вложений в этом сообщении.
-
allez
- Сообщения: 2223
- Статус: Не очень злой админ :-)
- ОС: SuSE, CentOS, FreeBSD, Windows
Re: Редактор с проверкой синтаксиса написания
OwnerCoder писал(а): ↑17.02.2009 13:22Блин читал я код, для этого я и написал в предыдущем посте:
Что это еще за русские буквы в условиях???
Ошибку я заметил но что это за "условие", кто дадумался его писать и что должно происходить по идеи
Вы че народ по вашему читать не умею? Меня самого это поразило (Кстати статья была с википедии)
А вы попробуйте кроме чтения еще и думать. ;)
Давайте разберем эту конструкцию:
Код: Выделить всё
} elseif ( условие ) {
$output [ ] = 'T_...';В переводе на русский это означает примерно следующее: "иначе, если выполняется какое-то условие, присвоить переменной $output какое-то значение". В общем, автор примера показал, как обрабатывать кавычки и дал понять, что дальше, мол, пишите сами. :)
P. S. И да, поскольку фраза "Что это еще за русские буквы в условиях???" находится в вашем посте после вывода сообщений об ошибках, а не после исходного текста, то ее было несколько затруднительно отнести к коду.
-
Фантом
- Сообщения: 463
- ОС: openSUSE
-
OwnerCoder
- Сообщения: 186
- ОС: OpenSuSe 11, Apple OS X 10.5.8
Re: Редактор с проверкой синтаксиса написания
Слил исходник QtCreator, нашел там модуль который отвечает за проверку кода, теперь буду разбираться. Потом отпишусь 