Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.90/70: Рейтинг темы: голосов - 70, средняя оценка - 4.90
0 / 0 / 0
Регистрация: 16.05.2012
Сообщений: 21

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

30.05.2012, 20:07. Показов 13790. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Нужно написать синтаксический анализатор для одного маленького фрагмента программы, т.е. проверка правильности грамматического построения предложений исходного текста программы.
Текст программы:

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

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

P.S анализатор только для этого конкретного кода, для этих слов, т.е. если тут нет оператора if, значит если я введу его (пусть даже корректно), то это должна быть ошибка.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
30.05.2012, 20:07
Ответы с готовыми решениями:

Синтаксический анализатор
Нужна помощь именно с алгоритмом. Задание звучит так - проверить корректность написания заголовка функции. Прототипы не учитываются. ...

Синтаксический анализатор
никак не могу разобраться с заданием, может быть кто-то сталкивался 1.Построить синтаксические диаграммы для следующих конструкций; ...

синтаксический анализатор
Доброго времени суток. Подскажите как написать синтаксический анализатор кода(паскаль). Как это правильно делать? как это сделано в средах...

15
0 / 0 / 0
Регистрация: 16.05.2012
Сообщений: 21
31.05.2012, 22:41  [ТС]
Отзовитесь, может кто-то помочь с написанием?
0
 Аватар для Gepar
1186 / 543 / 78
Регистрация: 01.07.2009
Сообщений: 3,517
01.06.2012, 01:03
Так что парсить надо-то? Так и не понял какие строки должны вводиться в ваше поле для ввода?
0
0 / 0 / 0
Регистрация: 16.05.2012
Сообщений: 21
01.06.2012, 08:22  [ТС]
Должен вводиться тот фрагмент кода, который в моём первом посте. И должно проверяется что всё синтаксически написано правильно, т.е. в моём случае, раз есть бегин, то должен быть и end, если есть открывающая скобка, должна быть и закрывающая, раз есть if, значит проверить что есть и then, проверить что всё это синтаксически правильно написано, и остальные ключевые слова тоже, пробелы, точка с запятой. Т.е. проверить на синтаксис этот кусок кода.
0
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
02.06.2012, 14:12
Tester123, вам надо проверять конкретно данный кусок кода, и никакой другой? Если так, то сравниваем посимвольно введённый фрагмент с эталоном, если какой-то символ не совпал - выводим ошибку и позицию символа. Только вот это бред сивой кобылы, никому нафиг такой "синтаксический анализатор" не нужен. Поэтому предполагаю, что входной язык должен быть как-то задан. Грамматику в студию!
0
0 / 0 / 0
Регистрация: 16.05.2012
Сообщений: 21
02.06.2012, 16:57  [ТС]
Я тоже думал представить этот кусок в видео строки и проверять каждый символ, например if s[1]<>i.... if s[2]<>f....
Но это по-моему и правда глупо, это будет ифов столько, сколько символов в коде, если я поставлю лишний пробел, уже работать не будет, хотя пробел не является ошибкой, если в showmessage напишу другое, тоже работать не будет, и ещё много чего. Т.е. надо как-то иначе. Надо проверить что все зарезервированные слова и идентификаторы верные, что после if должно обязательно идти условие и потом слово then, что если скобка есть, она должна и закрыться, что в конце точки с запятыми, что если мы увидели begin, то должны увидеть и end. Вот в таком ключе, т.е что есть в этом коде, надо учесть что в нём всё синтаксически верно. Если в showmessage или Edit1 я впишу значения другие, это не ошибка, а вот если я неверно напишу begin, или удалю and, или забуду скобку и т.д. вот это будет ошибка.
Как же это сделать? Поможете?
0
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
02.06.2012, 17:09
Tester123, по данному куску кода можно восстановить грамматику, и по ней написать парсер, но не факт, что грамматика будет верной. Кроме того, сравнивать каждый раз в if'е - дилетантский подход. Достаточно сравнить две строки с помощью оператора == (имеются ввиду строки std::string), и если сравнение вернёт false - значит строки не совпадают.

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

Добавлено через 5 минут
Ха, не заметил сначала, что нужно определять, какого типа ошибка была допущена. Тогда можно поступить так: считывать текст не по символам, а по словам, и проверять, совпадает ли очередное слово с ожидаемым. Если совпадает - переходить к чтению очередного слова, иначе говорить, какое слово ожидалось и какое было встречено и завершать разбор.
0
0 / 0 / 0
Регистрация: 16.05.2012
Сообщений: 21
02.06.2012, 17:46  [ТС]
Да, последнее ваше добавление подходит лучше всего. Я сейчас попробую это сделать на делфи, только я не понимаю как тут сравнивать две строки. Я ввожу этот фрагмент и считаю что это первая строка, а вторая что?
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,973
02.06.2012, 17:53
Цитата Сообщение от 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...
В результате всей этой свистопляски чей счётчик в конце проверки текста не обнулится - с тем и проблема. Но ещё раз оговорюсь - это очень приблизительно, на самом деле там тьма нюансов. И таки это сложно...
0
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
02.06.2012, 17:55
Tester123, вы синхронно выделяете слова из введённой строи и из эталонной и сравниваете их.
0
0 / 0 / 0
Регистрация: 16.05.2012
Сообщений: 21
02.06.2012, 17:56  [ТС]
Да ладно, мелочи учитывать не будем. Мне бы хоть основу сдать... А вот на плюсах я не особо код понимаю...

Добавлено через 1 минуту
silent_1991 не совсем понимаю, я могу взять подстроку из строки, например слово BEGIN, и как мне его сравнить с эталонной, просто проверить что оно там есть? а ещё ведь нужное расположение надо.
0
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
02.06.2012, 17:59
Tester123, у вас есть две строки: введённая и эталонная. Вы считываете очередное слово из введённой строки. Считываете очередное слово из эталонной. Проверяете считанные слова на совпадение.

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

Добавлено через 50 секунд
Я указал что ЯП - любой, может у кого-то на плюсах есть что-то...
0
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
02.06.2012, 18:06
Tester123, синхронно - это значит, что считываем слово из входной строки - тут же считываем из эталонной. Сравниваем считанные слова. Как вы будете это делать - зависит от языка программирования и ваших навыков. Алгоритм я вам сказал.
0
0 / 0 / 0
Регистрация: 16.05.2012
Сообщений: 21
02.06.2012, 18:11  [ТС]
Не догоняю.
0
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
02.06.2012, 18:15

Эталонная строка: "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".
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
02.06.2012, 18:15
Помогаю со студенческими работами здесь

Синтаксический анализатор. Рекурсия
Пожалуста, помогите кто чем может... знаю, что это не так сложно, но не представляю, как реализовывать. необходимо сделать с помощью...

Разработать синтаксический анализатор
Может кто помочь понять как должна выглядеть программа подобного вида? си++ знаю, но с этими анализаторами что то я не догнал( : ...

Лексический, синтаксический анализатор c++
Помогите пожалуйста, мне очень сложно понять как это делать( Разработать лексический и синтаксический анализатор так, чтобы...

Рекурсия, Синтаксический анализатор
нужно сделать Построить синтаксический анализатор для понятия &quot;простое выражение&quot;: &lt;простое выражение&gt;::=&lt;простой...

Синтаксический анализатор. Формула
Нужно построить синтаксический анализатор для понятия формула. Программа выдает ошибки. вот условие: и вот мой код: #include...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru