![]() |
|
|
![]()
|
|
| AlexP11223 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 52 Регистрация: 11.10.2011 Репутация: нет Всего: нет |
Подскажите, как надо решать эту задачу? Что почитать?
|
|||
|
||||
| DarkProg |
|
|||
![]() Законченный романтик ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1784 Регистрация: 11.3.2009 Где: Земля Репутация: нет Всего: 19 |
Парсинг строк и рекурсию.
-------------------- "И твоя голова всегда в ответе за то куда сядет твой зад..." "Я студент - скажите с какого я ВУЗа..." |
|||
|
||||
| AlexP11223 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 52 Регистрация: 11.10.2011 Репутация: нет Всего: нет |
Парсить строки я умею, а рекурсию как использовать? Можно ссылку на что-нибудь по этой теме, а то что-то не особо гуглится?
|
|||
|
||||
| ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 7 Всего: 386 |
на каком языке решать-то?
imho, метод рекурсивного спуска наиболее практичен для самодельных парсеров. -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! |
|||
|
||||
| AlexP11223 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 52 Регистрация: 11.10.2011 Репутация: нет Всего: нет |
Pascal/Delphi
|
|||
|
||||
| _Y_ |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1651 Регистрация: 27.11.2006 Репутация: 8 Всего: 34 |
Рекурсию используется для простоты алгоритма парсинга. При парсинге выделяется кусок (например, заключенный в скобки), этот кусок рекурсивно задается для парсинга той же функции, она парсит его и находит вложенные скобки... и так далее. Понятно, что не только со скобками так. Приоритет операций, например, разбивать можно аналогичным образом. ЗЫ: Во многих языках вроде бы есть встроенные или подключаемые библиотеки для парсинга мат или булевых выражений, записаннных текстом. -------------------- Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:) |
|||
|
||||
| AlexP11223 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 52 Регистрация: 11.10.2011 Репутация: нет Всего: нет |
А правильно ли я понимаю, что <выражение> ::= <цифра> | <выражение> + <цифра> | <выражение> – <цифра> означает, что строка S может быть
либо 8 либо 8 + 3 либо 8 - 3 (где 8 число, где 3 любая цифра) или как? какие еще есть варианты? Что означает <выражение>? Это сообщение отредактировал(а) Omfgnoob123 - 2.4.2012, 00:15 |
|||
|
||||
| ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 7 Всего: 386 |
Omfgnoob123,
правильнее будет переписать эту конструкцию так
Вот и рекурсия почти в чистом виде. -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! |
|||
|
||||
| DarkProg |
|
|||
![]() Законченный романтик ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1784 Регистрация: 11.3.2009 Где: Земля Репутация: нет Всего: 19 |
Это означает, что этот кусочек может иметь тот же формат, что и всё исходной выражение, и что к нему надо подходить с той же точки зрения парсинга, как и к общему выражению. Рекурсия, в общем и наиболее простом понимании - это вызов функции себя же самой, так для примера абсолютно непрактичный кусочек кода
Я думаю понятно, хотя сама по себе функция бессмысленна. -------------------- "И твоя голова всегда в ответе за то куда сядет твой зад..." "Я студент - скажите с какого я ВУЗа..." |
|||
|
||||
| AlexP11223 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 52 Регистрация: 11.10.2011 Репутация: нет Всего: нет |
Сделал с помощью этого самого рекурсивного спуска, однако препод сказал, что надо через дерево.
Погуглил дерево разбора, но как-то все примеры сложные (когда выражения более сложные, где важен приоритет операций и т.п.), а в деревьях и графах я плохо разбираюсь. Никто не подскажет с чего начать и как бы это реализовать? |
|||
|
||||
| Pavia |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 418 Регистрация: 6.12.2008 Репутация: 11 Всего: 12 |
Omfgnoob123,
В данной постановки профессор дурак либо вы что-то не поняли. Так как при помощи дерева проверяются не грамматические правила, а семантические. Дерево является результатом грамматического анализа. Вам всего навсего надо построить дерево в процессе вашего рекурсивного спуска. Делается это при выходи из рекурсии добавляя результирующее дерево, то в левое, то в правое поддерево. Это сообщение отредактировал(а) Pavia - 26.5.2012, 08:58 |
|||
|
||||
| user07 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 2 Регистрация: 23.10.2012 Репутация: нет Всего: нет |
НУ, КАКИЕ ПРЕДЛОЖЕНИЯ ИМЕЮТСЯ ПО ЗАДАННОЙ ЗАДАЧЕ???
Проверить правильность выражения, заданного в виде строки S. Если выражение составлено правильно, то вывести 0, в противном случае вывести номер первого ошибочного (или лишнего) символа в строке S. НА СИ++ ИЛИ PASCAL Это сообщение отредактировал(а) user07 - 19.12.2012, 14:51 |
|||
|
||||
| maxim1000 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 33 Всего: 110 |
user07, если вопрос в алгоритме для той задачи, которая описана, то в теме уже есть ответ
если нужна конкретная реализация - лучше в Центр Помощи -------------------- qqq |
|||
|
||||
| Akina |
|
||||
|
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 20 Всего: 454 |
Неэквивалентно. 1+2 соответствует второму, но не соответствует первому. Добавлено через 6 минут и 9 секунд Неправильно понимаешь. Вот пример простого выражения: 1+2-9 При этом на месте цифр 1 и/или 2 может стоять легитимное выражение. Например, если такое легитимное выражение будет 3+4-5, и оно стоИт только вместо первой цифра, то ты имеешь легитимное выражение: 3+4-5+2-9 Если вместо второй, то: 1+3+4-5-9 Если вместо обеих, то: 3+4-5+3+4-5-9 В любом из этих трёх выражений любая цифра любого подвыражения точно так же может быть заменена на любое легитимное выражение. Неограниченное количество раз. -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
||||
|
|||||
| Akina |
|
|||
|
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 20 Всего: 454 |
На самом деле в данной конкретной задаче всё проще.
В легитимном выражении: 1) Перваый и последний символы - цифры; 2) После цифры - знак плюс или минус; 3) После знака - цифра; 4) Количество плюсов в любом фрагменте от начала не меньше количества минусов; 5) Общее количество плюсов равно количеству минусов. Так что просто сканируем строку до первого несоответствия. Не встретилось - последовательность легитимна. Встретилось - это и есть начало косяка. -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
| ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 7 Всего: 386 |
Это как это? Что такое второе и что такое первое? В моей записи, операция это либо литера '-' либо литера '+'. Выражение, это число, но если после числа идет опрерация, то за операций идёт еще одно выражение. 1+2 вполне вписывается в мою грамматику. -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! |
|||
|
||||
| Akina |
|
|||
|
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 20 Всего: 454 |
Первое - определение в первой цитате в моём постинге, автор Omfgnoob123. Второе - определение во второй цитате в моём постинге, автор ksnk. Но совершенно не вписывается в грамматику исходного постинга. Какой смысл решать задачу, которую топикстартер не задавал? -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
| ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 7 Всего: 386 |
Это как это не задавал? -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! |
|||
|
||||
| Akina |
|
|||
|
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 20 Всего: 454 |
ksnk, а ты-то ему какую предложил решать? совсем другую.
-------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
| ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 7 Всего: 386 |
Почему другую? Моя грамматика эквивалентна заданной. Это, imho, очевидно, но можно попытаться и формально это доказать. Но в моей записи она, imho, более подходит к прямой реализации на ЯВУ. Да и вообще, насколько разумно продолжать тред, начатый 1 апреля? -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! |
|||
|
||||
| Akina |
|
|||
|
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 20 Всего: 454 |
Как всё запущено... Что выражение "1+2" соответствует твоей грамматике, мы уже договорились. А вот теперь будь любезен показать, что оно соответствует ИСХОДНОЙ грамматике
Когда будешь показывать, не забудь учесть, что скобок, указывающих на необязательность какого-то фрагмента, в ней не наблюдается. -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
| ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 7 Всего: 386 |
А символы | не означают выбор одного из 3-х возможных вариантов <выражения>? -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! |
|||
|
||||
| Akina |
|
|||
|
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 20 Всего: 454 |
Нет, конечно... поскольку нет скобок, формирующих группу лексем, этот символ означает выбор одного варианта из двух возможных лексем. Т.е. сначала цифра либо выражение, потом строго плюс, потом снова цифра либо выражение, потом строго минус, потом строго цифра.
-------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
| ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 7 Всего: 386 |
Хмм... скобок нет, действительно.
Может автор что-нибудь скажет, ели с апреля еще не забыл эту тему... -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! |
|||
|
||||
![]()
|
| Правила форума "Алгоритмы" | |
|
|
Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Алгоритмы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |