0 / 0 / 0
Регистрация: 16.05.2012
Сообщений: 21
1

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

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

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

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

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

P.S анализатор только для этого конкретного кода, для этих слов, т.е. если тут нет оператора if, значит если я введу его (пусть даже корректно), то это должна быть ошибка.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.05.2012, 20:07
Ответы с готовыми решениями:

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

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

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

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

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
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12453 / 7478 / 1752
Регистрация: 25.07.2009
Сообщений: 13,748
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...
В результате всей этой свистопляски чей счётчик в конце проверки текста не обнулится - с тем и проблема. Но ещё раз оговорюсь - это очень приблизительно, на самом деле там тьма нюансов. И таки это сложно...
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, у вас есть две строки: введённая и эталонная. Вы считываете очередное слово из введённой строки. Считываете очередное слово из эталонной. Проверяете считанные слова на совпадение.

Цитата Сообщение от 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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.06.2012, 18:15
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru