0 / 0 / 0
Регистрация: 16.05.2012
Сообщений: 21
|
|
1 | |
Синтаксический анализатор30.05.2012, 20:07. Показов 13078. Ответов 15
Метки нет (Все метки)
Нужно написать синтаксический анализатор для одного маленького фрагмента программы, т.е. проверка правильности грамматического построения предложений исходного текста программы.
Текст программы: Код
if (CEdit1.Text='') and (Kedit2.Text='') then begin ShowMessage('Please enter data');exit end; Написать можно на любом языке. Скажите пожалуйста, сложно ли это сделать? Может кто-то поможет? Хоть чем-то. Любым фрагментам кода буду рад (но сам я знаю только object pascal). P.S анализатор только для этого конкретного кода, для этих слов, т.е. если тут нет оператора if, значит если я введу его (пусть даже корректно), то это должна быть ошибка.
0
|
30.05.2012, 20:07 | |
Ответы с готовыми решениями:
15
Синтаксический анализатор Синтаксический анализатор синтаксический анализатор Синтаксический анализатор. Рекурсия |
0 / 0 / 0
Регистрация: 16.05.2012
Сообщений: 21
|
|
31.05.2012, 22:41 [ТС] | 2 |
Отзовитесь, может кто-то помочь с написанием?
0
|
1186 / 542 / 78
Регистрация: 01.07.2009
Сообщений: 3,517
|
|
01.06.2012, 01:03 | 3 |
Так что парсить надо-то? Так и не понял какие строки должны вводиться в ваше поле для ввода?
0
|
0 / 0 / 0
Регистрация: 16.05.2012
Сообщений: 21
|
|
01.06.2012, 08:22 [ТС] | 4 |
Должен вводиться тот фрагмент кода, который в моём первом посте. И должно проверяется что всё синтаксически написано правильно, т.е. в моём случае, раз есть бегин, то должен быть и end, если есть открывающая скобка, должна быть и закрывающая, раз есть if, значит проверить что есть и then, проверить что всё это синтаксически правильно написано, и остальные ключевые слова тоже, пробелы, точка с запятой. Т.е. проверить на синтаксис этот кусок кода.
0
|
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
|
|
02.06.2012, 14:12 | 5 |
Tester123, вам надо проверять конкретно данный кусок кода, и никакой другой? Если так, то сравниваем посимвольно введённый фрагмент с эталоном, если какой-то символ не совпал - выводим ошибку и позицию символа. Только вот это бред сивой кобылы, никому нафиг такой "синтаксический анализатор" не нужен. Поэтому предполагаю, что входной язык должен быть как-то задан. Грамматику в студию!
0
|
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, или забуду скобку и т.д. вот это будет ошибка. Как же это сделать? Поможете?
0
|
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
|
|
02.06.2012, 17:09 | 7 |
Tester123, по данному куску кода можно восстановить грамматику, и по ней написать парсер, но не факт, что грамматика будет верной. Кроме того, сравнивать каждый раз в if'е - дилетантский подход. Достаточно сравнить две строки с помощью оператора == (имеются ввиду строки std::string), и если сравнение вернёт false - значит строки не совпадают.
Добавлено через 1 минуту На самом деле, если действительно нужно проверять только заданный кусок кода и ничего больше, то грамматики тут - оверхед, потому что всё в итоге выльется в посимвольное сравнение всё равно. Странное задание, в общем. Добавлено через 5 минут Ха, не заметил сначала, что нужно определять, какого типа ошибка была допущена. Тогда можно поступить так: считывать текст не по символам, а по словам, и проверять, совпадает ли очередное слово с ожидаемым. Если совпадает - переходить к чтению очередного слова, иначе говорить, какое слово ожидалось и какое было встречено и завершать разбор.
0
|
0 / 0 / 0
Регистрация: 16.05.2012
Сообщений: 21
|
|
02.06.2012, 17:46 [ТС] | 8 |
Да, последнее ваше добавление подходит лучше всего. Я сейчас попробую это сделать на делфи, только я не понимаю как тут сравнивать две строки. Я ввожу этот фрагмент и считаю что это первая строка, а вторая что?
0
|
Модератор
12453 / 7478 / 1752
Регистрация: 25.07.2009
Сообщений: 13,748
|
|||||||||||
02.06.2012, 17:53 | 9 | ||||||||||
Если правильно понял, что Вам нужно, то да, это сложно. Прочитайте тему [C++] Пишем свой интерпретатор - найдёте много полезного.
Очень грубо говоря, на вскидку я бы как-то так делал: 1 завёл ассоциативный массив счётчиков вроде
3 дальше читать из предложения по слову, сравнивать с ключевыми (тут ещё нужно проверять первую/последнюю букву слова на совпадение с открывающей/закрывающей скобкой) и устанавливать при совпадении соответствующие счётчики
0
|
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
|
|
02.06.2012, 17:55 | 10 |
Tester123, вы синхронно выделяете слова из введённой строи и из эталонной и сравниваете их.
0
|
0 / 0 / 0
Регистрация: 16.05.2012
Сообщений: 21
|
|
02.06.2012, 17:56 [ТС] | 11 |
Да ладно, мелочи учитывать не будем. Мне бы хоть основу сдать... А вот на плюсах я не особо код понимаю...
Добавлено через 1 минуту silent_1991 не совсем понимаю, я могу взять подстроку из строки, например слово BEGIN, и как мне его сравнить с эталонной, просто проверить что оно там есть? а ещё ведь нужное расположение надо.
0
|
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
|
|
02.06.2012, 17:59 | 12 |
Tester123, у вас есть две строки: введённая и эталонная. Вы считываете очередное слово из введённой строки. Считываете очередное слово из эталонной. Проверяете считанные слова на совпадение.
А вот об этом раньше надо было думать, когда тему в плюсах размещали.
0
|
0 / 0 / 0
Регистрация: 16.05.2012
Сообщений: 21
|
|
02.06.2012, 18:03 [ТС] | 13 |
что означает синхронно? И как выделить слова? Я могу выделить лишь букву: if s1[i]=s2[i]...
Добавлено через 50 секунд Я указал что ЯП - любой, может у кого-то на плюсах есть что-то...
0
|
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
|
|
02.06.2012, 18:06 | 14 |
Tester123, синхронно - это значит, что считываем слово из входной строки - тут же считываем из эталонной. Сравниваем считанные слова. Как вы будете это делать - зависит от языка программирования и ваших навыков. Алгоритм я вам сказал.
0
|
0 / 0 / 0
Регистрация: 16.05.2012
Сообщений: 21
|
|
02.06.2012, 18:11 [ТС] | 15 |
Не догоняю.
0
|
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
|
|
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".
0
|
02.06.2012, 18:15 | |
02.06.2012, 18:15 | |
Помогаю со студенческими работами здесь
16
Разработать синтаксический анализатор Лексический, синтаксический анализатор c++ Рекурсия, Синтаксический анализатор Синтаксический анализатор. Формула Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |