Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проверить правильность выражения 
:(
    Опции темы
AlexP11223
Дата 1.4.2012, 20:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 11.10.2011

Репутация: нет
Всего: нет



Подскажите, как надо решать эту задачу? Что почитать?
Цитата

Проверить правильность выражения, заданного в виде строки S
 <выражение> ::= <цифра> | <выражение> + <цифра> | <выражение> – <цифра> 
 Если выражение составлено правильно, то вывести 0, в противном случае вывести номер первого ошибочного (или лишнего) символа в строке S.

PM WWW Skype   Вверх
DarkProg
Дата 1.4.2012, 20:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Законченный романтик
***


Профиль
Группа: Завсегдатай
Сообщений: 1784
Регистрация: 11.3.2009
Где: Земля

Репутация: нет
Всего: 19



Парсинг строк и рекурсию.


--------------------
"И твоя голова всегда в ответе за то куда сядет твой зад..."

"Я студент - скажите с какого я ВУЗа..."

 smile  smile  smile 
PM MAIL   Вверх
AlexP11223
Дата 1.4.2012, 20:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 11.10.2011

Репутация: нет
Всего: нет



Парсить строки я умею, а рекурсию как использовать? Можно ссылку на что-нибудь по этой теме, а то что-то не особо гуглится?
PM WWW Skype   Вверх
ksnk
Дата 1.4.2012, 21:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 7
Всего: 386



на каком языке решать-то? 
imho, метод рекурсивного спуска наиболее практичен для самодельных парсеров.


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
AlexP11223
Дата 1.4.2012, 21:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 11.10.2011

Репутация: нет
Всего: нет



Pascal/Delphi

PM WWW Skype   Вверх
_Y_
Дата 1.4.2012, 22:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1651
Регистрация: 27.11.2006

Репутация: 8
Всего: 34



Цитата(Omfgnoob123 @  1.4.2012,  20:49 Найти цитируемый пост)
рекурсию как использовать

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

Понятно, что не только со скобками так. Приоритет операций, например, разбивать можно аналогичным образом.

ЗЫ: Во многих языках вроде бы есть встроенные или подключаемые библиотеки для парсинга мат или булевых выражений, записаннных текстом.


--------------------
Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:)
PM MAIL WWW   Вверх
AlexP11223
Дата 2.4.2012, 00:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 11.10.2011

Репутация: нет
Всего: нет



А правильно ли я понимаю, что <выражение> ::= <цифра> | <выражение> + <цифра> | <выражение> – <цифра> означает, что строка  S может быть 
либо 8
либо 8 + 3
либо 8 - 3 (где 8 число, где 3 любая цифра)
или как? какие еще есть варианты? Что означает <выражение>?


Это сообщение отредактировал(а) Omfgnoob123 - 2.4.2012, 00:15
PM WWW Skype   Вверх
ksnk
Дата 2.4.2012, 07:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 7
Всего: 386



Omfgnoob123, 

правильнее будет переписать эту конструкцию так

Код

<операция> ::= "+"|"-"
<выражение> ::= <цифра> [ <операция> <выражение >]


Вот и рекурсия почти в чистом виде.


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
DarkProg
Дата 2.4.2012, 19:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Законченный романтик
***


Профиль
Группа: Завсегдатай
Сообщений: 1784
Регистрация: 11.3.2009
Где: Земля

Репутация: нет
Всего: 19



Цитата(Omfgnoob123 @  2.4.2012,  01:07 Найти цитируемый пост)
Что означает <выражение>?

Это означает, что этот кусочек может иметь тот же формат, что и всё исходной выражение, и что к нему надо подходить с той же точки зрения парсинга, как и к общему выражению.
Рекурсия, в общем и наиболее простом понимании - это вызов функции себя же самой, так для примера абсолютно непрактичный кусочек кода
Код

procedure MyInc(Var p, s:integer);
begin
  p:=p+1;
  if p<s then MyInc(p, s);
end;

Я думаю понятно, хотя сама по себе функция бессмысленна.


--------------------
"И твоя голова всегда в ответе за то куда сядет твой зад..."

"Я студент - скажите с какого я ВУЗа..."

 smile  smile  smile 
PM MAIL   Вверх
AlexP11223
Дата 25.5.2012, 20:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 11.10.2011

Репутация: нет
Всего: нет



Сделал с помощью этого самого рекурсивного спуска, однако препод сказал, что надо через дерево. 

Погуглил дерево разбора, но как-то все примеры сложные (когда выражения более сложные, где  важен приоритет операций и т.п.), а в деревьях и графах я плохо разбираюсь. Никто не подскажет с чего начать и как бы это реализовать?


PM WWW Skype   Вверх
Pavia
Дата 26.5.2012, 08:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 418
Регистрация: 6.12.2008

Репутация: 11
Всего: 12



Omfgnoob123, 
В данной постановки профессор дурак либо вы что-то не поняли. Так как при помощи дерева проверяются не грамматические правила, а семантические. 

Дерево является результатом грамматического анализа. Вам всего навсего надо построить дерево в процессе вашего рекурсивного спуска.
Делается это при выходи из рекурсии добавляя результирующее дерево, то в левое, то в правое поддерево.

Это сообщение отредактировал(а) Pavia - 26.5.2012, 08:58
PM MAIL   Вверх
user07
  Дата 19.12.2012, 14:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 23.10.2012

Репутация: нет
Всего: нет



НУ, КАКИЕ ПРЕДЛОЖЕНИЯ ИМЕЮТСЯ ПО ЗАДАННОЙ ЗАДАЧЕ??? smile
Проверить правильность выражения, заданного в виде строки S. Если выражение составлено правильно, то вывести 0, в противном случае вывести номер первого ошибочного (или лишнего) символа в строке S.  
НА СИ++ ИЛИ PASCAL

Это сообщение отредактировал(а) user07 - 19.12.2012, 14:51
PM MAIL   Вверх
maxim1000
Дата 19.12.2012, 17:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 33
Всего: 110



user07, если вопрос в алгоритме для той задачи, которая описана, то в теме уже есть ответ

если нужна конкретная реализация - лучше в Центр Помощи


--------------------
qqq
PM WWW   Вверх
Akina
Дата 19.12.2012, 17:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 20
Всего: 454



Цитата(Omfgnoob123 @  1.4.2012,  21:21 Найти цитируемый пост)
 <выражение> ::= <цифра> | <выражение> + <цифра> | <выражение> – <цифра> 


Цитата(ksnk @  2.4.2012,  08:44 Найти цитируемый пост)
<операция> ::= "+"|"-"
<выражение> ::= <цифра> [ <операция> <выражение >]

Неэквивалентно. 
1+2 соответствует второму, но не соответствует первому.

Добавлено через 6 минут и 9 секунд
Цитата(Omfgnoob123 @  2.4.2012,  01:07 Найти цитируемый пост)
А правильно ли я понимаю, что <выражение> ::= <цифра> | <выражение> + <цифра> | <выражение> – <цифра> означает, что строка  S может быть 
либо 8
либо 8 + 3
либо 8 - 3 (где 8 число, где 3 любая цифра)
или как? какие еще есть варианты? Что означает <выражение>?

Неправильно понимаешь.
Вот пример простого выражения:
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
В любом из этих трёх выражений любая цифра любого подвыражения точно так же может быть заменена на любое легитимное выражение. Неограниченное количество раз.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Akina
Дата 19.12.2012, 19:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 20
Всего: 454



На самом деле в данной конкретной задаче всё проще.
В легитимном выражении:
1) Перваый и последний символы - цифры;
2) После цифры - знак плюс или минус;
3) После знака - цифра;
4) Количество плюсов в любом фрагменте от начала не меньше количества минусов;
5) Общее количество плюсов равно количеству минусов.
Так что просто сканируем строку до первого несоответствия. Не встретилось - последовательность легитимна. Встретилось - это и есть начало косяка.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
ksnk
Дата 19.12.2012, 22:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 7
Всего: 386



Цитата(Akina @  19.12.2012,  17:41 Найти цитируемый пост)
Неэквивалентно. 
1+2 соответствует второму, но не соответствует первому.

Это как это? Что такое второе и что такое первое?
В моей записи, операция это либо литера '-' либо литера '+'. Выражение, это  число, но если после числа идет опрерация, то за операций идёт еще одно выражение.

1+2 вполне вписывается в мою грамматику.   


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Akina
Дата 19.12.2012, 23:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 20
Всего: 454



Цитата(ksnk @  19.12.2012,  23:30 Найти цитируемый пост)
Что такое второе и что такое первое?

Первое - определение в первой цитате в моём постинге, автор Omfgnoob123.
Второе - определение во второй цитате в моём постинге, автор ksnk.

Цитата(ksnk @  19.12.2012,  23:30 Найти цитируемый пост)
1+2 вполне вписывается в мою грамматику.    

Но совершенно не вписывается в грамматику исходного постинга. Какой смысл решать задачу, которую топикстартер не задавал?


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
ksnk
Дата 19.12.2012, 23:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 7
Всего: 386



Цитата(Akina @  19.12.2012,  23:18 Найти цитируемый пост)
Какой смысл решать задачу, которую топикстартер не задавал? 

Цитата

<выражение> ::= <цифра> | <выражение> + <цифра> | <выражение> – <цифра> 

Это как это не задавал?  smile 


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Akina
Дата 20.12.2012, 08:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 20
Всего: 454



ksnk, а ты-то ему какую предложил решать? совсем другую.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
ksnk
Дата 20.12.2012, 09:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 7
Всего: 386



Цитата(Akina @  20.12.2012,  08:47 Найти цитируемый пост)
ksnk, а ты-то ему какую предложил решать? совсем другую. 

Почему другую? Моя грамматика эквивалентна заданной. Это, imho, очевидно, но можно попытаться и формально это доказать. 
Но в моей записи она, imho,  более подходит к прямой реализации на ЯВУ.

Да и вообще, насколько разумно продолжать тред, начатый 1 апреля?  smile 



--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Akina
Дата 20.12.2012, 09:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 20
Всего: 454



Цитата(ksnk @  20.12.2012,  10:24 Найти цитируемый пост)
Моя грамматика эквивалентна заданной. Это, imho, очевидно

Как всё запущено...
Что выражение "1+2" соответствует твоей грамматике, мы уже договорились.
А вот теперь будь любезен показать, что оно соответствует ИСХОДНОЙ грамматике 
Код

<выражение> ::= <цифра> | <выражение> + <цифра> | <выражение> – <цифра>

Когда будешь показывать, не забудь учесть, что скобок, указывающих на необязательность какого-то фрагмента, в ней не наблюдается.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
ksnk
Дата 20.12.2012, 11:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 7
Всего: 386



Цитата(Akina @  20.12.2012,  09:40 Найти цитируемый пост)
Когда будешь показывать, не забудь учесть, что скобок, указывающих на необязательность какого-то фрагмента, в ней не наблюдается. 

А символы | не означают выбор одного из 3-х возможных вариантов <выражения>?


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Akina
Дата 20.12.2012, 12:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 20
Всего: 454



Нет, конечно... поскольку нет скобок, формирующих группу лексем, этот символ означает выбор одного варианта из двух возможных лексем. Т.е. сначала цифра либо выражение, потом строго плюс, потом снова цифра либо выражение, потом строго минус, потом строго цифра.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
ksnk
Дата 20.12.2012, 12:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 7
Всего: 386



Хмм... скобок нет, действительно.

Может автор что-нибудь скажет, ели с апреля еще не забыл эту тему...  smile 


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Алгоритмы | Следующая тема »


 




[ Время генерации скрипта: 0.0694 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.