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

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

30.05.2012, 20:07. Показов 13852. Ответов 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
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru