ronniko
> Чтобы компьютер решил этот пример его надо парсить, что не удобно и не быстро.
какой ужас :)
NicoAZ ты пишешь не по делу. И вместо ответов по теме, ты решил пообсуждать мой возраст.
Помоему ты неадекват.
https://gamedev.ru/flame/forum/?id=291510&page=2&m=6084031#m29
ronniko
> ты пишешь не по делу
Так никто ж так и не знает, что за дело такое, в котором парсить выражение нельзя.
Зато вот возраст прям надо обязательно обсудить.
Так никто ж так и не знает, что за дело такое, в котором парсить выражение нельзя.
хочется без парсинга делать. И оформить , так чтобы быстро и просто считать.
Будет скрипт для звуковых фильтров.
Типа такого.
float resonance = 0.1; float Q = 0.707; float theta = PI * 2.0f * cutoff; float alpha = sin(theta) / ( 2.0f * resonance)+Q/4; float cosw = cos( theta); float beta = ( 1.0f - cosw) * 0.5f; float a0inv = 1.0f / ( 1.0f + alpha); float b0 = a0inv * beta; float b1 = a0inv * 2.0f * beta; float b2 = a0inv * beta; float a1 = a0inv * -2.0f * cosw; float a2 = a0inv * ( 1.0f - alpha);
ronniko
> хочется без парсинга делать
Зачем, если с парсингом легко, удобно и приятно?
И ничуть не медленнее, если парсинг происходит на этапе "компиляции" скрипта. Просто в таком случае вместо сразу вычисления строится дерево операторов.
ronniko
> какой ужас
Никакого ужаса, просто надо правильно смотреть:
ВЫРАЖЕНИЕ: [ "-" ] ПРОИЗВЕДЕНИЕ [ АДДИТИВНЫЙ_ОПЕРАТОР ПРОИЗВЕДЕНИЕ [ АДДИТИВНЫЙ_ОПЕРАТОР ПРОИЗВЕДЕНИЕ [...] ] ]
АДДИТИВНЫЙ_ОПЕРАТОР: "+" | "-"
ПРОИЗВЕДЕНИЕ: ТЕРМ [ МУЛЬТИПЛИКАТИВНЫЙ_ОПЕРАТОР ТЕРМ [ МУЛЬТИПЛИКАТИВНЫЙ_ОПЕРАТОР ТЕРМ [...] ] ]
МУЛЬТИПЛИКАТИВНЫЙ_ОПЕРАТОР: "*" | "/"
ТЕРМ: ЧИСЛО | ФУНКЦИЯ | ПЕРЕМЕННАЯ | СКОБКИ
ФУНКЦИЯ: ИМЯ_ФУНКЦИИ "(" АРГУМЕНТЫ ")"
АРГУМЕНТЫ: ВЫРАЖЕНИЕ [ "," ВЫРАЖЕНИЕ [ "," ВЫРАЖЕНИЕ [...] ] ]
СКОБКИ: "(" ВЫРАЖЕНИЕ ")"здесь квадратные скобки обозначают необязательную часть, вертикальная черта - альтернативы.
Каждую из этих строчек можно фактически реализовать функцией, которая получает на вход остаток строки, вызывает внутри себя другие функции, и возвращает результат того, что смогла распарсить, и остаток строки.
Реализуй уже парсер выражений на асме и закрой гештальт.
Dmitry_Milk
Реализуй уже парсер выражений на асме и закрой гештальт.
у меня есть уже и причем года три назад сделал.
fasm поделка на 3 500 байт. Писал для скриптов.
Я Мастера пугал им :)
https://gamedev.ru/flame/forum/?id=285850
А хочется чего-то более интересного и простого и изящно-элегантного.
Считаю, что нынче парсить примеры не модно :)

ronniko
> А хочется чего-то более интересного и простого и изящно-элегантного.
Максимально простое - фортоподобный синаксис. Те самые польские нотации прямые или обратные. Прям проще некуда. Парсер только для лексем нужен.
Чуть сложнее - лиспоподобный синтаксис. В добавление к парсеру лексем пишется еще 10 строк разбора скобок.
Операторный синтаксис реально в десятки раз сложнее последнего, но если не делал такого еще, то рекомендую просто для разминки мозгов, программисту пристойно иметь такую задачу за плечами решенной.
ronniko
> Зато вот возраст прям надо обязательно обсудить.
Естественно, надо возраст обсудить. Ещё уровень компетенций и академическую степень неплохо было бы обсудить, помимо возраста. Вы реально предполагаете, что всем поголовно интересно обсуждать тригонометрические функции и арифметические выражения (они же "примеры"), с ребенком, который значения этих слов только-только нагуглил, при чем ещё не всех?
ronniko
> ты пишешь не по делу
Вот по делу. Гуглится за 5 секунд. Но Вас не аналитическая форма информации интересует, вы создание тему на форуме в поиске общения и называете ее "Давайте поговорим о...", после чего называете неадекватными тех, кто приходит с Вами поговорить.
NicoAZ
> Естественно, надо возраст обсудить. Ещё уровень компетенций и академическую степень неплохо было бы обсудить, помимо возраста.
Я вас попрошу птичку нашу не обижать
Роннико за последние недели похоже единственный во флейме, кто спрашивает про программирование, а не про квантово-механический оккультизм, содержанок, политоту, тачки и прочую херомантию.
Dmitry_Milk
> Роннико за последние недели похоже единственный во флейме, кто спрашивает про программирование, а не про квантово-механический оккультизм, содержанок, политоту, тачки и прочую херомантию.
Вот тут вынужден с Вами согласиться... Учитывая качество и содержание среднего сообщения на форуме, вопросы о том, как написать Хеллоувоплд на Пайтоне тут скоро за счастье будут...
ronniko
> и мы моглибы сразу решать каждую часть параллельно.
Это вообще идея-фикс функциональных языков.
Выражение 77-2+8*(5-х)/2+у*x можно записать на лиспоподобном синтаксисе так:
(+ (- 77 2) (/ (* 8 (- 5 x)) 2) (* y x))
Синтаксис экстремально простой - скобка открывает операцию первая лексема в скобке - это сама операция, все остальные написанные через пробел - это аргументы операции и каждый аргумент может снова быть операцией.
Таким образом у корневой операции + 3 аргумента которые тоже являются операциями:
(- 77 2)
(/ (* 8 (- 5 x)) 2)
(* y x)
Так вот идея простая - операции на одном уровне вложенности могут теоретически быть запущены параллельно - таким образом лиспоподобный синтаксис явным образом прописывает возможности параллелизма.
Однако операция не может завершиться раньше, чем завершатся (пока не будем вспоминать про ленивые вычисления) все её аргументы - таким образом лиспоподобный синтаксис явно прописывает последовательность операций.
Получающееся дерево по сути в ширину описывает параллелизм, а в глубину - последовательность.
(/ (* 8 (- 5 x)) 2) самая глубокая операция и в ней умножение на 8 не сможет завершится пока не дождётся выполнения (- 5 x), хотя вся эта цепочка может выполняться параллельно выполнению соседней ветки с (* y x).
Какие выводы из этого можно сделать для тебя лично? А хрен его знает.
=A=L=X=
> можно записать на лиспоподобном синтаксисе так
kipar её и предложил. не?
skalogryz
> kipar её и предложил. не?
Он вскользь упомянул, а я расписал.
Вообще прикольно как ФЯ сперва очень рекламирует себя широкими возможностями для параллелизма, а потом когда до практики доходит, то оказывается, что в реальной программе повсюду начинают торчать уши "сковывающих последовательностей", которые как раз ограничивают параллелизм как выше описано.
Хотя тоже прикольно, что получается, что в программе их можно чётко выделять и они по сути явно прописаны. Интересный взгляд на мир. Просто хочешь не хочешь, но если надо получить программу реагирующую на инпут - инпут придётся прошивать явной последовательностью которая в том числе запретит параллелизм и гонку разных потоков за ввод.
По сути "как ни крутись, но в реальных программах леща параллелизма придётся урезать, ибо иначе они не заработают по дизайну".
Выражение 77-2+8*(5-х)/2+у*x можно записать так
Выражение 77-2++8*(5-х)/2++у*x
решаем до -- или ++
1)77-2
2)8*(5-х)/2
3)у*x
4) три ответа сложить.
либо пробел заюзать 77-2+ 8*(5-х)/2+ у*x