Вверх ↑
Этот топик читают: Гость
Разработчик
Ответов: 4698
Рейтинг: 426
#91: 2014-07-01 00:30:43 ЛС | профиль | цитата
Galkov писал(а):
Вариант cnt=0 у нас допустим

На этот счет я уже готовил фразу "нет, не допустим", но сейчас поглядел в код повнимательнее - действительно, если не ставить скобку (а этот вариант я забыл протестировать), то будет считаться как 0 аргументов. И кстати, там еще второй баг: байт код генерируется только для случая, когда аргумент есть хотя бы один. Это поправлю.
Galkov писал(а):
А хочется, ведь - большего:

После взгляда на такое я начинаю понимать смысл жизни, что это -- явно не та задача, которую я решал перед тем, как написать первый пост в этом топике. Пожалуй, свой вклад в MathParse мне придется ограничить только тем, что уже сделано. Так что я лучше постараюсь оттестить тот код, что уже есть, и на этом закончу.
------------ Дoбавленo в 00.30:
А, да, забыл добавить еще несколько фич:
- Подсчет размера стека при компиляции
- Подсчет длины MT-цепочки для передачи вверх на точку
Их я тоже сделаю.
карма: 10
0
Ответов: 9906
Рейтинг: 351
#92: 2014-07-02 13:18:52 ЛС | профиль | цитата
Assasin писал(а):
На этот счет я уже готовил фразу "нет, не допустим"

А зачем условие ставил if cnt>0 then

Assasin писал(а):
После взгляда на такое я начинаю понимать смысл жизни

Да ладно тебе...

Ну да, не шашкой махать.
НО, есть же главное - можно делать по частям....
Ну полсотни строк кода... Ну может чуть больше, ибо не все еще продуманно.
Ну да - не десять. Но ведь можно же сделать так, чтобы это на другие уровни не влияло.

Вот.......
А уровней нас вовсе не сто. И в шею особо никто не гонит.
Вполне себе... За конечное время, можно сделать результат, к которому потом не подходить десятилетиями. А он будет работать.
Лично мне - просто интересен сам факт: за конечное время... к которому потом не подходить
Типа - именно в этом и есть смысл жизни

Но это так - опять философия. Не бери в голову. Лучше всего - развеяться немного (типа на пляж сходить)



------------ Дoбавленo в 10.39:
Assasin писал(а):
Так что я лучше постараюсь оттестить тот код, что уже есть, и на этом закончу

У меня есть предложение -- сменить тональность на менее печальную.

Да, совершенно необходимо выложить боевой вариант, с указанными тобой характеристиками:

1) Подсчет длины MT-цепочки для передачи вверх на точку - тут относительно просто все.

2) Подсчет размера стека при компиляции - тут мне представляется, что без рекурсивного анализа не обойтись. Да хоть бы и открытое поле maxSP в TResult.

И у меня есть несколько дополнительных (к твоим) соображений:

3) Компилировать ТОЛЬКО по SetLine и SetDebug. А сообщения об ошибке выдавать только по doCalc. Или реально запускать, коль скоро нет ошибок. Не, ну сам подумай: пусть есть ошибка компиляции, и мы, как дураки, на каждый doCalc начинаем компилировать. Типа - а вдруг в прошлый раз СЛУЧАЙНО не откомпилировалось.

4) LPos у нас дурацкий какой-то... Вообще-то он указывает на начало следующей лексемы, после ошибочной. Думаю, его надо забуферизировать. Типа, в GetToken сохранять его (после скипа пробельных) в какой-нибудь OldPos. Который в последствии и использовать. А из их разница, кстати говоря - даст длину лексемы ошибки...

5) CalcErrPos - надо взять от nesco из MathParse.

6) Синтаксическую диаграмму надо переделать нафиг.

Соображения по п.3 - руки у меня шаловливые, и это почти у меня реализовано - я выложу для посмотреть, и подумать.
По п.6 - у меня нарисовано, но дома. Вечером выложу. Думаю, для тебя это не трудно будет.
Ибо здесь важна не скоропись, а понимание происходящего.
Зато правильно получится. Да и работают такие вещи, обычно - почти с первого раза.



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

И, главное - он приспособлен (после внедрения TResult) к расширениям в сторону оптимизации.
Могут далее появиться Боевой+, Боевой++...

Если не зарекаться


------------ Дoбавленo в 20.44:
Соображения по п.3 - руки у меня шаловливые, и это почти у меня реализовано - я выложу для посмотреть, и подумать.
По п.6 - у меня нарисовано, но дома. Вечером выложу. Думаю, для тебя это не трудно будет.

Вот код
А вот синтаксис:

Синтаксис

============= Синтаксис ================================================================================================
<Expression> := <Compare> { <TokLog> <Compare> }. // Логические операторы (and or xor)
<Compare> := [ 'not' ] <Addition> { <TokCmp> <Addition> }. // Логический NOT, и сравнение (< > <= >= = <>)
<Addition> := [ ('+'|'-') ] <Production> { ('+'|'-') <Production> }. // Сложение/Вычитание
<Production> := <Powers> { <TokMul> <Powers> }. // Умножение/Деление
<Powers> := <BinExp> { '^' <BinExp> }. // Возведение в степень
<BinExp> := <Binary> { <TokBin> <Binnary }. // Бинарные операторы (& | ! << >>)
<Binary> := [ '~' ] <Atoms>. // Бинарная инверсия (~)
<Atoms> := <TokArg> [ '[' <Expression> [ ',' <Expression> ] ']' // Просто Пин, или Массив, или Матрица
| '(' <Expression> { ',' <Expression> } ')' ] // или Пин-Функция
| <TokName> [ '(' <Expression> { ',' <Expression> } ')' ] // или Функции (встроенные, и пользовательские)
| '(' <Expression> ')' // или Просто скобочная рекурсия
| <TokNumber> | <TokHex> | <TokReal>. // или Тупо константа

============= Сканер ===================================================================================================
SKIP := ' ' | #9 | #10 | #13.
<TokLog> := 'and' | 'or' | 'xor'.
<TokCmp> := '<' | '<>' | '<=' | '>' | '>=' | '='.
<TokMul> := '*' | '/' | 'div' | 'mod'.
<TokBin> := '&' | '|' | '!' | '<<' | '>>'.
<TokArg> := '%' <TokNumber>.
<TokName> := <isLetter> { <isLetter> | <isDigit> }.
<TokNumber> := <isDigit> { <isDigit> }.
<TokHex> := ( '&#36;' | '0x' ) <isHEX> { <isHEX> }.
<TokReal> := ( <isDigit> { <isDigit> } [ '.' { <isDigit> } ]
| '.' <isDigit> { <isDigit> } )
[ ('E'|'e') ['+'|'-'] <isDigit> { <isDigit> } ].
ERROR := <isANY>.

// <isXXX> - это один символ из соответствующего множества
// их всегда можно записать как <isXXX> := 'sym1' | 'sym2' | ... .
------------ Дoбавленo в 07.59:
BTW:
В принципе, для операций сравнения уже существуют общепринятые суффиксы GT, LT, GE, LE, EQ, NE.
Так было бы лучше:
#pas
....
Cmd_GT = $14; // >
Cmd_LT = $15; // <
Cmd_GE = $16; // >=
Cmd_LE = $17; // <=
Cmd_EQ = $18; // =
Cmd_NE = $19; // <>
....


------------ Дoбавленo в 13.18:
Вот еще предложение...
А вот пускай множественный Compare (операции сравнения) будет У НАС обладать такой семантикой:

E0 <cmp1> E1 <cmp2> E2 <cmp3> E3 ... <cmpn> En ==> (E0 <cmp1> E1) and (E1 <cmp2> E2) and (E2 <cmp3> E3) ... and (En-1 <cmpn> En)

И при этом, всякие там арифметические выражения E1 ... En-1 мы будем считать только один раз.
Естественно.
карма: 9

0
Разработчик
Ответов: 4698
Рейтинг: 426
#93: 2014-07-02 15:45:27 ЛС | профиль | цитата
Galkov писал(а):
А вот пускай множественный Compare (операции сравнения) будет У НАС обладать такой семантикой

А это вообще как и зачем?
карма: 10
0
Ответов: 9906
Рейтинг: 351
#94: 2014-07-02 16:26:15 ЛС | профиль | цитата
Это, во-первых, так есть в MatParse. Ситаксически. Но работает противоестественно.
Для нормального человека, а не для челов, которые различают приоритеты унарного и бинарного минусов

Ну, например: 9 < X^2 + Y^2 < 16
Чего, спрашивается, делает с этим MathParse...
Он делает первое сравнение (Level1a), и получает либо нуль, либо один - в зависимости от данных.
Делает второе сравнение, полученного результата (0/1) с числом 16 -- и тупо получает единицу.

Предлагается, чтобы результат был БЫ, КАК БЫ -- от такой формулы: (9 < X^2 + Y^2) and (X^2 + Y^2 < 16)
Да, мы можем и ручками написать такую формулу.
НО, считать выражение в серединке нам придется ДВА РАЗА (не считая того, что стучать по клавишам больше придется).
В нормальных язЫках программирования, мы можем избежать двойного вычисления: запомнить результат в локальную переменную, которую потом и будем использовать в двух сравнениях.

А мы - не можем.
Вот в этом и смысл предложения - чтобы вышеозначенный пример считал сумму квадратов один раз, и определял принадлежность "кольцу", с внутренним радиусом 3, и внешним - 4.

Соответственно, в предложенной синтаксической диаграмме, в выражении для нетерминала <Compare>, последнюю пару квадратных скобок - заменить на пару фигурных...

------------ Дoбавленo в 16.26:
Собственно, у меня работает уже... Вроде бы.
карма: 9

0
Ответов: 8918
Рейтинг: 823
#95: 2014-07-02 17:27:38 ЛС | профиль | цитата
Galkov, так в выражении введённом пользователем могут быть более одной пары скобок с одинаковыми выражениями внутри, например: ...(%1^2 + %2^3)....(%1^2 + %2^3).. или с операциями сравнения ..((%1 + %2)>0)*%3 + ((%1 + %2)<=0)*%4.., искать их для замены на вычисленную один раз новую переменную или оставить на совести пользователя, который ради экономии числа компонентов всё вложил в один MatParse
карма: 19

0
Ответов: 9906
Рейтинг: 351
#96: 2014-07-02 20:57:04 ЛС | профиль | цитата
Леонид писал(а):
искать их для замены на вычисленную один раз новую переменную или оставить на совести пользователя, который ради экономии числа компонентов всё вложил в один MatParse

Да ну его нафиг - искать. Сложно это. И объяснить потом трудно: "это вот считается, а это вот запомнилось..."
Боюсь я закладывать шибко много интеллекта. Поди объясни его потом
В принципе, один раз "запомнилось" - у нас уже есть. Это входные данные, и это как-то там в справке написано.

А вот для "двойного сравнения" - гораздо проще все именно в понимании.
Один раз написано - один раз и посчитается. В том месте, где написано.

Мне вот так кажется



------------ Дoбавленo в 20.57:
Assasin, ну ты блин даешь...
У мине в Move аргументы наоборот стоят, а ты молчишь как партизан
У меня неправильно, а у тебя - ПРАВИЛЬНО.
Я тебе увлеченно рассказываю про нулик в конце строки, показывая неправильную команду.
А ты - молчишь, со своей "правильной"
карма: 9

0
Разработчик
Ответов: 4698
Рейтинг: 426
#97: 2014-07-02 22:04:10 ЛС | профиль | цитата
Galkov писал(а):
У мине в Move аргументы наоборот стоят, а ты молчишь как партизан
У меня неправильно, а у тебя - ПРАВИЛЬНО.

Ну так я почти все вручную переделываю, только твои функции копирнул, смотрю - какая-то белиберда копируется вместо строки, смотрю свой старый вариант - ага, аргументы поменял и забыл.
карма: 10
0
Ответов: 9906
Рейтинг: 351
#98: 2014-07-02 23:20:18 ЛС | профиль | цитата
А я, как бы в тупую (в блокноте), заменил MathParse на Ex - в своем калькуляторе:

expcalcex.png
У меня же все имена в формулах работают через CmdUNFunc (с тем самым, с cnt=0).

Как бы "тест на тупую замену элемента" - пройден, можно сказать (только DebugMode надо по умолчанию в false поставить)
карма: 9

0
файлы: 1expcalcex.png [11.2KB] [778]
Разработчик
Ответов: 4698
Рейтинг: 426
#99: 2014-07-06 22:56:45 ЛС | профиль | цитата
Galkov писал(а):
только DebugMode надо по умолчанию в false поставить

Тогда я не пойму, над чем мы работаем: над полноценной (и полностью совместимой) заменой MathParse или клепаем новый элемент на его основе? Если новый, так это я много чего могу понапридумывать (правда не сразу реализовать )
Смена приоритетов и изменение логики сравнений кстати тоже не вписывается в рамки совместимости.
------------ Дoбавленo в 22.56:
Предлагаю вот что: сейчас сделать полносовместимую замену MathParse (дабы в старые проекты с MathParse вдохнуть новую жизнь), а после этого заняться принципиально новым компонентом с нескучными иконками, назвав его, скажем, MathProcessor. Добавить в него туеву хучу фич (а может и переменные, функции...)... Ну, в общем, обсуждать обновки уже для него, а не для старичка MathParse.
карма: 10
0
Ответов: 9906
Рейтинг: 351
#100: 2014-07-07 10:54:43 ЛС | профиль | цитата
Assasin писал(а):
Смена приоритетов и изменение логики сравнений кстати тоже не вписывается в рамки совместимости.

Это не оправдывает сделанную глупость.
Это если жестко, но в полном соответствии с Истиной

А если конкретно, покажите мне того идиота, который не заключал бы условия в скобки (из-за идиотизма в приоритетах же).
Или делал двойное сравнение.


------------ Дoбавленo в 10.47:
Или, про уже упомянутую формулу: (- X^2 + Y^2)
Нет у меня никакого настроения объяснять народу, почему это есть СУММА квадратов, а не разность.
Исправить это (кстати говоря, см. вышеприведенный синтаксис) - значит потерять обратную совместимость.
И чего теперь
Тоже мне, нашли святую корову...

------------ Дoбавленo в 10.54:
И, между прочим, такие изменения (вышеприведенный синтаксис) весьма легко внести и в MathParse.
Чтобы потом не говорить: "а-я-яй - нету обратной совместимости"
И, если Благородные Доны сегодня скажут КУ, то завтра же все будет тип-топ (очень хорошо)

Не понимаю, почему бы благородным донам не испить благородного Ируканского вина ((с) Стругацкие)
карма: 9

0
Ответов: 9906
Рейтинг: 351
#101: 2014-07-08 12:35:11 ЛС | профиль | цитата
Блин, опять Благородные Доны отмалчиваются...
Уже все можно было сделать, протестировать, и рассказать про обнаруженные "несовместимости".
Или про их необнаружение (в практических схемах).

Предлагается изменить систему приоритетов для операторов в соответствии с вышеизложенным.
Добавить мимоходом 6 побитовых операций, и выкинуть к чертовой матери унарный минус (и, как следствие, костыль в сканере).
((Логика <= Лог.отрицание <= Сравнение <= Сложение <= Умножение <= Степень <= Бин.Логика <= Бин.Инверсия))
Делов, блин - на вечер. С крайне малой вероятностью глюков. Крайне малой.

Вопросы эти считаю едиными, как для штатного MathParse, так и для Ex-а.
И для штатного, их уже давно можно было закрыть

А Вы молчите. Неужели нравится, что (- X^2 + Y^2) считается как сумма квадратов.
карма: 9

0
Разработчик
Ответов: 26113
Рейтинг: 2126
#102: 2014-07-08 14:39:01 ЛС | профиль | цитата
Galkov писал(а):
А Вы молчите. Неужели нравится, что (- X^2 + Y^2) считается как сумма квадратов

Не, но это не правильно, так не должно быть. Если есть возможность исправить, то надо править обязательно. КМК, то вряд ли кто использовал этот баг в своих целях.
карма: 22

0
Ответов: 9906
Рейтинг: 351
#103: 2014-07-08 16:13:04 ЛС | профиль | цитата
Гы-Гы
А наш коллега Assasin - считает, что нормально.
Assasin писал(а):
Galkov писал(а):
Скажем, какой результат будет наиболее естественным для -2^2
Для нормального человека.

4

карма: 9

0
Разработчик
Ответов: 26113
Рейтинг: 2126
#104: 2014-07-08 16:22:19 ЛС | профиль | цитата
Тут есть одно "но", может я чего-то упустил, но тогда для правильного счета необходимо всегда представлять внешний аргумент как бы в скобках.
карма: 22

0
Ответов: 9906
Рейтинг: 351
#105: 2014-07-08 16:27:58 ЛС | профиль | цитата
nesco писал(а):
Если есть возможность исправить, то надо править обязательно

Дык как же нет, когда запросто.

nesco, ты пойми, так получилось, что сейчас происходит некоторое переосмысление сделанного.
Совершенно на другом уровне знаний.
Вот полное переосмысление и изложено в диаграмме. Целиком, как бы. Чтобы потом еще на пару десятков лет (а лучше - навсегда) забыть про это.
А вы от нее отмахиваетесь как черт от ладана

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

А то что же получается. Помру -- и никто ничего грамотно (в смысле - с соответствии с постановкой задачи) не разрулит.
Ну или в ополченцы запишусь

------------ Дoбавленo в 16.27:
nesco писал(а):
но тогда для правильного счета необходимо всегда представлять внешний аргумент как бы в скобках
Чего то не понял твоего вопроса
карма: 9

0
Сообщение
...
Прикрепленные файлы
(файлы не залиты)