Вверх ↑
Этот топик читают: Гость
Разработчик
Ответов: 25681
Рейтинг: 2087
#61: 2014-06-26 14:43:12 ЛС | профиль | цитата
Assasin писал(а):
Так я и не говорю, что ты, наоборот на скриншотах отчетливо видно, что добавлял это Dilma

Оно появилось именно в ревизии 1268, в 743 этого ничего не было. А 1268 именно та ревизия, когда я добавил правки Galkov-a. Сравни сам ревизии 1268 и 743, и тебе станет все ясно
карма: 20

0
Ответов: 9906
Рейтинг: 351
#62: 2014-06-26 14:52:47 ЛС | профиль | цитата
Блин, Вы просто скажите КУ, или не КУ
вопрос: должен ли про not знать MathParse


Там делов -- на пару строк, а вы разборки устраиваете
карма: 9

0
Разработчик
Ответов: 4680
Рейтинг: 423
#63: 2014-06-26 14:56:33 ЛС | профиль | цитата
Да пущай будет, тем более я уже добавил реализацию CmdNot.
карма: 10
0
Ответов: 9906
Рейтинг: 351
#64: 2014-06-26 17:13:52 ЛС | профиль | цитата
ТОДЫ: nesco, сделай такие изменения, и будет у нас not

#pas
procedure THIMathParse.Level4; // Смена знака, лог. not
var op:char;
begin
op := ' ';
if (Token = '-')or(Token = '+')or(Token = 'not') then begin
op := Token[1];
GetToken;
end;
Level5(x);
if op = '-' then x := -x else
if op = 'n' then x := ord(x=0);
end;
карма: 9

0
Разработчик
Ответов: 25681
Рейтинг: 2087
#65: 2014-06-26 17:33:19 ЛС | профиль | цитата
Galkov писал(а):
и будет у нас not

Исправил
карма: 20

0
Ответов: 9906
Рейтинг: 351
#66: 2014-06-27 09:26:59 ЛС | профиль | цитата
nesco писал(а):
Я не стал глубоко лезть в коды, а просто сделал привязку к тому, что было

Дык это понятно.

Есть исходные данные на уровне форсмажора, есть понятная цель - и ты ее достигнул с помощью CalcErrPos
Ну ладно.
Давай так.
Пусть ТЕПЕРЯ исходные данные, на уровне того самого форсмажора -- будут другие:

#pas
procedure THIMathParse.SetLine;
begin
Line := Value;
end;
И все, никаких плясок с бубном.
И немного подрихтуем GetToken:

#pas
procedure THIMathParse.GetToken;
begin
Token := ';
TokType := 0;
while Line[LPos] in [,#9,#10,#13] do inc(LPos);
case Line[LPos] of
........
#0: TokType := TokEnd;
end;
end;

Вот, и вопрос к тебе, как к автору CalcErrPos - чего, неужели его нельзя "подпилить" под новые условия, для работы непосредственно с Line (безо всяких safe..)
карма: 9

0
Разработчик
Ответов: 25681
Рейтинг: 2087
#67: 2014-06-27 10:06:21 ЛС | профиль | цитата
Galkov писал(а):
неужели его нельзя "подпилить" под новые условия

Можно попробовать, конечно.
Я не поймуу только, а вот это

  Line := Value+#1;
уже больше не нужно, в коде же вроде вылавливается эта #1
карма: 20

0
Ответов: 9906
Рейтинг: 351
#68: 2014-06-27 12:43:47 ЛС | профиль | цитата
Почесал я в репе... Потом еще почесал...
Посмотрел, как другой народ делает, и подумал -- а пошло он в... Ну Вы в курсе

Угу, вылавливалось для TokEnd.
Пусть теперь нулик вылавливает (посмотри последние строки исправлений в GetToken постом выше)
Припоминается мне (давно же было), что была какая-то боязнь, что GetToken как то там "за конец" строки залезет со своими проверками.
Не, НЕ ЗАЛЕЗЕТ. Типа - отвечаю.

nesco, нормально все будет. Репу же я - больше пяти минут чесал



------------ Дoбавленo в 12.43:
Широковещательный вопрос
А нет ли желания у Благородных Донов - обсудить полную синтаксическую диаграмму для MathParse
Вот, я ее нарисовал, глядя на коды (см. ниже). И здесь каждому нетерминалу (имя в левой части) соответствует наш какой-то LevelXXX
В общем, есть довольно прозрачное соответствие этой диаграммы - исполняющему ее коду.
Типа, поменять уже сделанную архитектуру - пол-часа трудов....

MathParse

<Expression> := <Addition>   { <Tok4Cmp> <Addition>   }.                // Логическое сравнение (< > <= >= = <>)
<Addition> := <Production> { <Tok4Add> <Production> }. // Сложение/Вычитание
<Production> := <Powers> { <Tok4Mul> <Powers> }. // Умножение/Деление
<Powers> := <SignLogic> { <Tok4Pow> <SignLigic> }. // Возведение в степень
<SignLogic> := [<Tok4Unary>] <Logic>. // Смена знака и лог. not
<Logic> := <Atoms> { <Tok4Logic> <Atoms> }. // Лог.опер(and or xor)
<Atoms> := <Tok4Arg> [ '[' <Expression> [ ',' <Expression> ] ']' // Просто пин, Массив, Матрица
| '(' <Expression> { ',' <Expression> } ')' ] // или Пин-Функция
| <TokName> [ '(' <Expression> { ',' <Expression> } ')' ] // или Функции (встроенные, и пользовательские)
| '(' <Expression> ')' // или Просто скобочная рекурсия
| <Literal>. // или Тупо константа
И у меня к ней есть вопросы
А у Вас
карма: 9

0
Разработчик
Ответов: 4680
Рейтинг: 423
#69: 2014-06-27 14:12:21 ЛС | профиль | цитата
Galkov писал(а):
И у меня к ней есть вопросы

Поменять местами <Logic> и <SignLogic>. Остальное норм. И это вроде не полчаса делается, а пять минут - циферки у названий функций levelXXX поменять.
карма: 10
0
Ответов: 9906
Рейтинг: 351
#70: 2014-06-27 14:22:58 ЛС | профиль | цитата

карма: 9

0
Разработчик
Ответов: 4680
Рейтинг: 423
#71: 2014-06-27 15:14:03 ЛС | профиль | цитата
Galkov писал(а):
Скажем, какой результат будет наиболее естественным для -2^2
Для нормального человека.

4
Galkov писал(а):
Наконец, можно посмотреть на приоритеты логический операций, операций сравнения, арифметических операций -- в других ЯВУ.
Противоестественно это смотрится как-то.

Как я понял, брался в пример паскаль, у него логические and or xor получаются методом "взять в скобки аргументы", с MathParse получается то же самое.
Galkov писал(а):
Assasin, ты вот этот костыль видел:
А ну ка расскажи, чего он делает

Отделяет унарные операции от бинарных. (унарных / * ^ не существует). Ну по крайней мере в теории.
карма: 10
0
Ответов: 9906
Рейтинг: 351
#72: 2014-06-27 15:53:23 ЛС | профиль | цитата
Assasin писал(а):
4

А для нормального человека, которому в лом напрягаться с различием приоритетов для унарного и бинарного минусов -- будет -4
Как, впрочем, и эти слова хитромудрые вспоминать

Assasin писал(а):
Как я понял, брался в пример паскаль, у него логические and or xor получаются методом "взять в скобки аргументы"

Про "взять в скобки" - нет вопросов.
У скобок, везде и во все времена, приоритет самый высокий.
Тебя одно спрашивают: приоритеты логический операций, операций сравнения, арифметических операций -- в других ЯВУ
А ты мне про скобки.
Как будто у других людей (знакомых с другими ЯВУ) после твоего объяснения пропадут свои привычки.
И, в отличие от Паскаля, отсутствие скобок у нас НЕ МЕНЯЕТ семантику. Как были эти операторы логическими (а не побитовыми), так ими и остались.

Assasin писал(а):
Ну по крайней мере в теории

В теории, как раз все не так.
Если убрать этот костыль из Лексического Анализатора, то Синтаксический Анализатор будет допускать подобные формулы: %1 /- 3 ++ %2
В полном соответствии с теорией (приведенной синтаксической диаграммой).
Этот костыль просто исправляет кривизну Синтаксического Анализатора.
А белые люди (к каковым себя, в те далекие времена - я отнести еще не мог) исправляют кривизну Синтаксического Анализатора, а не вставляют костыли в Лексический Анализатор.
Это я теперь знаю (на примере других язЫков), как такие вопросы разруливать. А не тогда...
карма: 9

0
Разработчик
Ответов: 4680
Рейтинг: 423
#73: 2014-06-27 16:04:47 ЛС | профиль | цитата
Galkov писал(а):
А для нормального человека, которому в лом напрягаться с различием приоритетов для унарного и бинарного минусов -- будет -4

Значит я ненормальный В школе даже ошибки из-за этого в контрольных по математике делал.
Galkov писал(а):
Как были эти операторы логическими (а не побитовыми), так ими и остались.

Ааа... Вот ты о чем, это да, побитовых у нас нет (по-моему это меня даже огорчало однажды). Добавить-то не проблема. Вопрос - в какой форме? Можно дополнительно добавить операторы & | ~, которые будут побитово работать с числами. Но это может ввести путаницу в применение операторов and or not (да еще и xor нереализован останется). Остается вариант как в паскале - зависит от места, где встречается?
P.S.: у меня пока времени не настолько много, чтобы поспевать за вами, у меня пока в голове оптимизация, а мы тут уже целиком компонент перелопачивать начали.
карма: 10
0
Ответов: 9906
Рейтинг: 351
#74: 2014-06-27 16:33:51 ЛС | профиль | цитата
Assasin писал(а):
а мы тут уже целиком компонент перелопачивать начали

Я же тебе говорил - пол-часа.
А ты - пять минут, пять минут
------------ Дoбавленo в 16.31:
Просто, перед тем, как потратить эти пол-часа -- надо пол-дня подумать
------------ Дoбавленo в 16.33:
Assasin писал(а):
Можно дополнительно добавить операторы & | ~, которые будут побитово работать с числами

Почему бы и нет...
А чего народ (который молчит пока) скажет

карма: 9

0
Разработчик
Ответов: 25681
Рейтинг: 2087
#75: 2014-06-27 19:27:49 ЛС | профиль | цитата
Galkov писал(а):
А чего народ (который молчит пока) скажет

Не, я пас. Тут нашего главного математика спрашивать надо -- Леонида
карма: 20

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