Вверх ↑
Ответов: 9906
Рейтинг: 351
#1: 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