223 / 37 / 4
Регистрация: 18.11.2012
Сообщений: 1,502
|
||||||||||||||||||||||||||
1 | ||||||||||||||||||||||||||
Грамматика в программировании12.10.2017, 21:55. Показов 3417. Ответов 20
Метки нет (Все метки)
Страуструп в книге даёт вводные данные про грамматику в программировании и даётся схема
Код
Пример простой грамматики выражений: Выражение: Терм Выражение "+" Терм //сложение Выражение "-" Терм //вычитание Терм: Первичное выражение Терм "*" Первичное выражение //умножение Терм "/" Первичное выражение //деление Терм "%" Первичное выражение //остаток(деление по модулю) Первичное выражение: Число "(" Выражение ")" //группировка Число: литерал_с_плавающей_точкой И следом даётся задание: Кликните здесь для просмотра всего текста
//Выражения Кликните здесь для просмотра всего текста
//Терм Кликните здесь для просмотра всего текста
//Первичное выражение Кликните здесь для просмотра всего текста
//Вспомогательные типы Token, Token_stream и объявления Кликните здесь для просмотра всего текста
Не знаю почему, но в тему не могу вникнуть с ходу, нужна помощ! p.s. А если я захочу сделать операцию возведения в степень '^', но чтобы преоритет был ниже '+', '-', то как это должно выглядит, может так? Кликните здесь для просмотра всего текста
2
|
12.10.2017, 21:55 | |
Ответы с готовыми решениями:
20
Формальная грамматика Чем отличается однозначная грамматика от неоднозначной? Математика в программировании Самые известные личности в программировании |
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
|
|
12.10.2017, 23:49 | 2 |
В исходной грамматике самым высшим приоритетом обладает
Первичное выражение . Логично добавить факториал туда, т.е.Код
Первичное выражение: Число "(" Выражение ")" Первичное выражение ! У тебя кажись проблемы с понятием приоритет. Чем он выше, тем раньше будет выполнена операция. Я наверно не ошибусь, если скажу, что у возведения в степень приоритет должен быть аналогичным факториалу, да и правило вывода наверно Первичное выражение ^ Первичное выражение
0
|
223 / 37 / 4
Регистрация: 18.11.2012
Сообщений: 1,502
|
||||||
13.10.2017, 04:48 [ТС] | 3 | |||||
Нет, тут ты ошибаешься, я пример привёл, возможно, некорректный с '^' , но суть не в этом, я хотел спросить, как быть, если я вдруг решу какую-то операцию сделать с приоритетом ниже, чем у '+', '-'? Пока не придумал такой опреции.
Код
Выражение: Терм Выржение "какая-то моя оперция" Выражение.. Выражение "+" Терм Выражение "-Э Терм Я туда и добавил
Пойду ещё помедитирую.
0
|
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
|
|
13.10.2017, 10:05 | 4 |
Посмотри список операций в Си/Си++, там таких полно.
Исходя из исходной грамматики, но по смыслу можно добавить какое-нибудь Низшее выражение ... Не туда. Подозреваю, что твоя штука не осилит (1+1)! .
0
|
223 / 37 / 4
Регистрация: 18.11.2012
Сообщений: 1,502
|
||||||
13.10.2017, 21:52 [ТС] | 5 | |||||
Как? Может как-то так?
Код
Выражение лайт: Выражение Выражение лайт "," Выржение Выражение: Терм Выраженеи "+" Терм Выражение "-" Терм Кликните здесь для просмотра всего текста
Но, подозреваю, что ты имел ввиду нечто другое, судя по Код
Первичное выражение: Число "(" Выражение ")" Первичное выражение !
0
|
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
|
|
13.10.2017, 23:38 | 6 |
По такой логике ты должен был вызывать
expression() внутри expression() .Думаю, что тебе стоит почитать про типы грамматик, понять к какому типу относится твоя грамматика, и в итоге разобраться с алгоритмом рекурсивного спуска (вроде именно он у тебя фигурирует).
0
|
223 / 37 / 4
Регистрация: 18.11.2012
Сообщений: 1,502
|
|
14.10.2017, 03:29 [ТС] | 7 |
Я и пытаюсь разобраться. Если вызвать expression() внутри expression() получится бесконечная рекурсия. Я не просто так, ради развлечения задаю вопросы, если я не так делаю, можно сказать, и я попытаюсь исправить, если эту схему можно расширять, то почему бы не добавить новое правило, скажем Первичное_выражение_лёгкое, которое будет вызывать Первичное выражение:
Код
Выражение: Терм Выражение "+" Терм //сложение Выражение "-" Терм //вычитание Терм: Первичное выражение лёгкое Терм "*" Первичное выражение лёгкое //умножение Терм "/" Первичное выражение лёгкое //деление Терм "%" Первичное выражение лёгкое //остаток(деление по модулю) Первичное выражение лёгкое: Первичное выражение Первичное выражение "^" Первичное выражение лёгкое Первичное выражение "!" Первичное выражение: Число "(" Выражение ")" //группировка Число: литерал_с_плавающей_точкой
0
|
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
|
|
14.10.2017, 08:29 | 8 |
Liss29, я сам ни разу не открывал Страуструпа, так что не могу знать что там по чем.
Однако теория грамматик - это очень большой раздел который, если хочется в нем разбираться, его нужно дополнительно отдельно изучать. Можно и добавить. Это наверно будет даже работать. Возьми бумажку, напиши некоторое не самое простое выражение, и посмотри как будет работать метод рекурсивного спуска для грамматики. Я сам это дело не настолько хорошо помню, чтобы кого-то учить.
1
|
223 / 37 / 4
Регистрация: 18.11.2012
Сообщений: 1,502
|
|
16.10.2017, 17:55 [ТС] | 9 |
Как-то работает через раз. Получаетя, если я добавляю правило, количество рекурсивных вызово увелививается, а это не есть хорошо, тогда я не понимаю, как добавить "!" или "^" в правило Первичное выражение.
Там только некая вводная часть, если так можно выразиться, схема, котору я привёл в вопросе, объяснение её весьма поверхностное и реализация правил в коде.
0
|
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
|
|
16.10.2017, 18:42 | 10 |
Вот когда это действительно станет проблемой, тогда и можно задуматься о переделке рекурсии во что-то более приличное. Но этого-то от тебя никто не требует.
В идеале должно распознаваться выражение вида (1+1)!! , т.е. факториал от результата выполнения факториала. Но это вторично, забей и двигайся дальше по учебнику.
0
|
mat_for_c
|
16.10.2017, 19:23
#11
|
0
|
nonedark2008
|
16.10.2017, 19:49
#12
|
0
|
223 / 37 / 4
Регистрация: 18.11.2012
Сообщений: 1,502
|
|
17.10.2017, 04:04 [ТС] | 13 |
(1+1)!! не выводит, ошибка вылетает, но если написать ((1+1)!)! тода расознаёт выражение, так же выржение вида 18+(2*(2^3)/2-4)+5 выбрасывает исключение, если делаю (2*(2^3)/2), то нормально считает. Так что либо я намудрил с создание лишнего правила, либо реализовал правило не так как надо.
Я тоже так думаю, может дальше по тексту будет продолжение и тема будет раскрыта более развёрнуто. Спасибо! Добавлено через 7 часов 24 минуты Хотя нет, выражение 18+(2*(2^3)/2-4)+5 нормально решается, так что осталось разобраться с (1+1)!!
0
|
223 / 37 / 4
Регистрация: 18.11.2012
Сообщений: 1,502
|
|
18.10.2017, 05:18 [ТС] | 14 |
Если требуется написать грамматики для описания логических выражений, то:
Код
Выражение: Терм Выражение "|" Терм Терм: Первичное выражение Терм "^" Первичное выражение Первичное выражение: Унарное выражение Первичное выражение "&" унарное выражение Унарное выражение: Приоритетное выражение ~Унарное выражение !Унарное выражение Приоритетное выражение: Число "(" Выражение ")" Число: целое_число
0
|
27 / 32 / 14
Регистрация: 08.09.2017
Сообщений: 448
|
|
19.10.2017, 17:54 | 15 |
Liss29,
вы уверены в том, что знаете операцию "-"? 1. да это бинарная операция вычитания типа 3 - 2 2. да это унарная операция типа - 1. (её приоритет выше, чем приоритет умножения)
0
|
223 / 37 / 4
Регистрация: 18.11.2012
Сообщений: 1,502
|
|
26.10.2017, 05:55 [ТС] | 16 |
Я уверен, что знаю операцию "~".
Мы про одно и тоже или как? Я спрашиваю про последнюю грамматику, а ты про что?
0
|
27 / 32 / 14
Регистрация: 08.09.2017
Сообщений: 448
|
|
26.10.2017, 09:09 | 17 |
Liss29
Знаком "-" обозначают две операции 1. бинарную операцию вычитание, пример 4 - 3 = 1 2. унарную операцию минус, пример -(5) = -5 у этих операций и приоритет разный... ... примечание кстати таким же свойством обладаем операция "+". правда большого значения она не имеет.
0
|
223 / 37 / 4
Регистрация: 18.11.2012
Сообщений: 1,502
|
|
27.10.2017, 15:51 [ТС] | 18 |
Я в курсе. А () - имеют приоритет гораздо выше чем "-" хоть унарный, хоть бинарный. А про грамматики, я в них плаваю, а не в приоритетах.
0
|
27 / 32 / 14
Регистрация: 08.09.2017
Сообщений: 448
|
|
27.10.2017, 16:24 | 19 |
Liss29,
самый высокий приоритет имеют скобки (). Вам надо определиться с алгоритмом, который будет определять в какой паре скобок можно производить вычисления, а где нет ... (как делаю я) я всё арифметическое выражение сначала заключаю в (). Для чего? Чтобы получить результат, надо вычислить последнюю пару скобок. А раз всё выражение в скобках и эта последняя пара скобок вычислена, то полученный результат и есть искомый.
0
|
[Bicycle Reinventor]
|
|
27.10.2017, 16:58 | 20 |
Рекомендую почитать цикл статей Руслана Спивака по написанию интерпретатора Паскаля. Первые статьи в цикле хорошо описывают грамматику калькулятора и её реализацию в виде кода.
Весьма интересный материал.
0
|
27.10.2017, 16:58 | |
27.10.2017, 16:58 | |
Помогаю со студенческими работами здесь
20
Какие области в программировании вам интересны? КС-грамматика Грамматика Однозначная грамматика без правой и левой рекурсии Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |