Форум программистов, компьютерный форум CyberForum.ru

Синтаксический анализатор - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 43, средняя оценка - 4.67
Tester123
0 / 0 / 0
Регистрация: 16.05.2012
Сообщений: 21
30.05.2012, 20:07     Синтаксический анализатор #1
Нужно написать синтаксический анализатор для одного маленького фрагмента программы, т.е. проверка правильности грамматического построения предложений исходного текста программы.
Текст программы:

Код
if (CEdit1.Text='') and (Kedit2.Text='') then 
begin ShowMessage('Please enter data');exit end;
Это должно быть просто окно, куда я вставляю код и при нажатии кнопки либо выдаётся сообщение что всё отлично, либо (если я ввожу какую-то синтаксическую ошибку) говорит что возникла ошибка у указывается какого рода (хорошо бы ещё показать в каком месте, но не обязательно).
Написать можно на любом языке.

Скажите пожалуйста, сложно ли это сделать? Может кто-то поможет? Хоть чем-то. Любым фрагментам кода буду рад (но сам я знаю только object pascal).

P.S анализатор только для этого конкретного кода, для этих слов, т.е. если тут нет оператора if, значит если я введу его (пусть даже корректно), то это должна быть ошибка.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Tester123
0 / 0 / 0
Регистрация: 16.05.2012
Сообщений: 21
31.05.2012, 22:41  [ТС]     Синтаксический анализатор #2
Отзовитесь, может кто-то помочь с написанием?
Gepar
 Аватар для Gepar
1173 / 529 / 20
Регистрация: 01.07.2009
Сообщений: 3,512
01.06.2012, 01:03     Синтаксический анализатор #3
Так что парсить надо-то? Так и не понял какие строки должны вводиться в ваше поле для ввода?
Tester123
0 / 0 / 0
Регистрация: 16.05.2012
Сообщений: 21
01.06.2012, 08:22  [ТС]     Синтаксический анализатор #4
Должен вводиться тот фрагмент кода, который в моём первом посте. И должно проверяется что всё синтаксически написано правильно, т.е. в моём случае, раз есть бегин, то должен быть и end, если есть открывающая скобка, должна быть и закрывающая, раз есть if, значит проверить что есть и then, проверить что всё это синтаксически правильно написано, и остальные ключевые слова тоже, пробелы, точка с запятой. Т.е. проверить на синтаксис этот кусок кода.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
02.06.2012, 14:12     Синтаксический анализатор #5
Tester123, вам надо проверять конкретно данный кусок кода, и никакой другой? Если так, то сравниваем посимвольно введённый фрагмент с эталоном, если какой-то символ не совпал - выводим ошибку и позицию символа. Только вот это бред сивой кобылы, никому нафиг такой "синтаксический анализатор" не нужен. Поэтому предполагаю, что входной язык должен быть как-то задан. Грамматику в студию!
Tester123
0 / 0 / 0
Регистрация: 16.05.2012
Сообщений: 21
02.06.2012, 16:57  [ТС]     Синтаксический анализатор #6
Я тоже думал представить этот кусок в видео строки и проверять каждый символ, например if s[1]<>i.... if s[2]<>f....
Но это по-моему и правда глупо, это будет ифов столько, сколько символов в коде, если я поставлю лишний пробел, уже работать не будет, хотя пробел не является ошибкой, если в showmessage напишу другое, тоже работать не будет, и ещё много чего. Т.е. надо как-то иначе. Надо проверить что все зарезервированные слова и идентификаторы верные, что после if должно обязательно идти условие и потом слово then, что если скобка есть, она должна и закрыться, что в конце точки с запятыми, что если мы увидели begin, то должны увидеть и end. Вот в таком ключе, т.е что есть в этом коде, надо учесть что в нём всё синтаксически верно. Если в showmessage или Edit1 я впишу значения другие, это не ошибка, а вот если я неверно напишу begin, или удалю and, или забуду скобку и т.д. вот это будет ошибка.
Как же это сделать? Поможете?
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
02.06.2012, 17:09     Синтаксический анализатор #7
Tester123, по данному куску кода можно восстановить грамматику, и по ней написать парсер, но не факт, что грамматика будет верной. Кроме того, сравнивать каждый раз в if'е - дилетантский подход. Достаточно сравнить две строки с помощью оператора == (имеются ввиду строки std::string), и если сравнение вернёт false - значит строки не совпадают.

Добавлено через 1 минуту
На самом деле, если действительно нужно проверять только заданный кусок кода и ничего больше, то грамматики тут - оверхед, потому что всё в итоге выльется в посимвольное сравнение всё равно. Странное задание, в общем.

Добавлено через 5 минут
Ха, не заметил сначала, что нужно определять, какого типа ошибка была допущена. Тогда можно поступить так: считывать текст не по символам, а по словам, и проверять, совпадает ли очередное слово с ожидаемым. Если совпадает - переходить к чтению очередного слова, иначе говорить, какое слово ожидалось и какое было встречено и завершать разбор.
Tester123
0 / 0 / 0
Регистрация: 16.05.2012
Сообщений: 21
02.06.2012, 17:46  [ТС]     Синтаксический анализатор #8
Да, последнее ваше добавление подходит лучше всего. Я сейчас попробую это сделать на делфи, только я не понимаю как тут сравнивать две строки. Я ввожу этот фрагмент и считаю что это первая строка, а вторая что?
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
02.06.2012, 17:53     Синтаксический анализатор #9
Цитата Сообщение от Tester123 Посмотреть сообщение
Скажите пожалуйста, сложно ли это сделать?
Если правильно понял, что Вам нужно, то да, это сложно. Прочитайте тему [C++] Пишем свой интерпретатор - найдёте много полезного.
Очень грубо говоря, на вскидку я бы как-то так делал:
1 завёл ассоциативный массив счётчиков вроде
C++
1
2
3
4
5
std::map <std::string, int> counters;
counters["BEGIN_END"] = 0;
counters["IF_THEN"] = 0;
counters["BRACKETS"] = 0;
// etc...
2 поделил текст на предложения по символу ;
3 дальше читать из предложения по слову, сравнивать с ключевыми (тут ещё нужно проверять первую/последнюю букву слова на совпадение с открывающей/закрывающей скобкой) и устанавливать при совпадении соответствующие счётчики
C++
1
2
3
4
5
6
7
8
9
10
11
std::string word;
//...
if ( word == "BEGIN" )
    counters["BEGIN_END"]++;
if ( word == "END" )
    counters["BEGIN_END"]--;
if ( *word.begin() == '(' )
    counters["BRACKETS"]++;
if ( *word.rbegin() == ')' )
    counters["BRACKETS"]--;
// etc...
В результате всей этой свистопляски чей счётчик в конце проверки текста не обнулится - с тем и проблема. Но ещё раз оговорюсь - это очень приблизительно, на самом деле там тьма нюансов. И таки это сложно...
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
02.06.2012, 17:55     Синтаксический анализатор #10
Tester123, вы синхронно выделяете слова из введённой строи и из эталонной и сравниваете их.
Tester123
0 / 0 / 0
Регистрация: 16.05.2012
Сообщений: 21
02.06.2012, 17:56  [ТС]     Синтаксический анализатор #11
Да ладно, мелочи учитывать не будем. Мне бы хоть основу сдать... А вот на плюсах я не особо код понимаю...

Добавлено через 1 минуту
silent_1991 не совсем понимаю, я могу взять подстроку из строки, например слово BEGIN, и как мне его сравнить с эталонной, просто проверить что оно там есть? а ещё ведь нужное расположение надо.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
02.06.2012, 17:59     Синтаксический анализатор #12
Tester123, у вас есть две строки: введённая и эталонная. Вы считываете очередное слово из введённой строки. Считываете очередное слово из эталонной. Проверяете считанные слова на совпадение.

Цитата Сообщение от Tester123 Посмотреть сообщение
А вот на плюсах я не особо код понимаю
А вот об этом раньше надо было думать, когда тему в плюсах размещали.
Tester123
0 / 0 / 0
Регистрация: 16.05.2012
Сообщений: 21
02.06.2012, 18:03  [ТС]     Синтаксический анализатор #13
что означает синхронно? И как выделить слова? Я могу выделить лишь букву: if s1[i]=s2[i]...

Добавлено через 50 секунд
Я указал что ЯП - любой, может у кого-то на плюсах есть что-то...
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
02.06.2012, 18:06     Синтаксический анализатор #14
Tester123, синхронно - это значит, что считываем слово из входной строки - тут же считываем из эталонной. Сравниваем считанные слова. Как вы будете это делать - зависит от языка программирования и ваших навыков. Алгоритм я вам сказал.
Tester123
0 / 0 / 0
Регистрация: 16.05.2012
Сообщений: 21
02.06.2012, 18:11  [ТС]     Синтаксический анализатор #15
Не догоняю.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.06.2012, 18:15     Синтаксический анализатор
Еще ссылки по теме:

C++ Синтаксический анализатор понятия скобки
C++ Разработать синтаксический анализатор
Реализовать синтаксический анализатор языка C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
02.06.2012, 18:15     Синтаксический анализатор #16

Эталонная строка: "abc def ghi".
Введённая строка: "abc def ghz".
Считываем первую пару слов (et_word - слово из эталонной строки, rd_word - слово из считанной строки):
et_word: "abc".
rd_word: "abc".
match: ok.
Считываем вторую пару слов:
et_word: "def".
rd_word: "def".
math: ok.
Считываем третью пару слов:
et_word: "ghi".
rd_word: "ghz".
match: error. expected "ghi".
Yandex
Объявления
02.06.2012, 18:15     Синтаксический анализатор
Ответ Создать тему
Опции темы

Текущее время: 17:52. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru