Эзотерический поискФорумСобрание заблуждений

Парсер с интуицией

#0
7:54, 10 янв 2012
ВНИМАНИЕ! Представленный документ может без изменения и как есть запускаться в
качестве сценария, что не вызовет генерацию какой-либо ошибки какого-либо рода
в исполняемой среде. Так, читаемый в настоящий момент текст относится к классу
комментариев и игнорируется парсером. Причём никакой специальной пометки текст
не имеет и интерпретируется за комментарий примерно по тем же принципам, что и
при субъективном зрительном анализе, когда секции с вычислениями и формулами с
первого взгляда легко выделяются и отделяются от общего документального текста
субъективного содержания. Это является одной из основных особенностей языка, в
общем плане улучщающей читабильность листингов плюс с борьбой с избыточностью.

DrawLine( Здесь описывается определение функции, причём скобкой отделяется имя
x1 0.0    не только от аргументов, но и служит началом строки комментариев. На
y1 0.0    остальных строчках описываются, собственно, аргументы используемые в
x2 0.0    качестве источников вводных данных. А так же их тип со значениями по
y2 0.0    умолчанию.
):        Когда все аргументы описаны заключением в скобки, двоеточие начинает
.lastX ?? описывать свойства функции и её состояние с прошлого момента вызова,
.lastY ?? которые должны объявляться как неопределённые при описании функции.
        (#x2 y2#) Если x2/y2 умещается в числовом значении и являются числами,
                dx = x2 - x1 вычисляем длину отрезка по осям x и y, объявляя
                dy = y2 - y1 попутно ещё несколько локальных переменных
                (|dx| > |dy|) Вычисляя модули определяем наибольшее значение в
                ........len = |dx| качестве абсолютной длины отрезка из dx/dy.
                ........len = |dy| Пунктированием завершаем блок ИСТИНА и ЛОЖЬ
                dx / len Теперь делим переменные dx и dy для получения нужных
                dy / len коэффициентов интерполирования вектора на растровой
                lastX = x1 + 0.5 матрице. Попутно иницируем значения основного
        ........lastY = y1 + 0.5 цикла вывода группы пикслей в ряд одной линии
        (len--) Заметим, что постфиксный декремент - двойной минус и слитно
                DrawPixel(lastX, lastY)
                lastX + dx, lastY + dy Допускается и такая запись.
........true
Из представленного примера значительная часть записей имеет очевидный смысл. В
других случаях следует подчеркнуть и разобрать наиболее вазные элементы языка:
        (какое-либо условие)
                Блок операций, выполняемый, пока условие истино
                Допускается произвольное число строк, конструктивных вхождений
        ________Подчёркивание отделяет блок цикла от блока, который должен был
                выполниться, если цикл вообще не совершался. Однако, в данном
                блоке допускается совершить любые действие и попытаться цикл
                запустить вновь. Но только одной попыткой!
        ........Если цикл перезапускать не следует, блок завершается пунктиром
Тем самым, описанная конструкция работает как сложный комплекс сочетаний таких
стандартных операций, как do-while и if-else. Ниже описанно устройство данной
конструкции:
        (condition--)
                any_function(value)
                value + condition
представляется как:
        while(condition --) {
                any_function(value)
                value += condition
        }
Пример 2:
        (condition--)
                any_function(value)
        ........value + condition
представляется как:
        while(condition --) {
                any_function(value)
                value += condition
                break
        }
оптимизируется в:
        if(condition --) {
                any_function(value)
                value += condition
        }
Пример 3:
        (condition--)
                any_function(value)
        ________value + condition
                -condition
        ........value = 0
представляется как:
        if(!condition) {
                condition --
                condition = -condition
                value = 0
        } else {
                while(condition --) {
                        any_function(value)
                        value += condition
                }
        }
Пример 4:
        (condition--)
                any_function(value)
        ________value + condition
                -condition
                value = 0
представляется как:
        if(!condition) {
                condition --
                condition = -condition
                value = 0
        }
        while(condition --) {
                any_function(value)
                value += condition
        }
Пример 5:
                any_function(value)
        ________value + condition
        (condition --)
представляется как:4
        do {
                any_function(value)
                value += condition
        } while(condition --)
Пример 6:
        (condition--)
        ========0
                value = 0
        ........any_function(value)
        ========1
                value = 1
        ........any_function(value)
        ========2 4..6
                value = 2
                any_function(value)
        ========3
                value = 3
                any_function(value)
        ========
                value = -1
представляется как:
        switch(condition --) {
        case 0:
                value = 0
                any_function(value)
                break
        case 1:
                value = 1
                any_function(value)
                break
        case 2:
        case 4: case 5: case 6:
                value = 2
                any_function(value)
        case 3:
                value = 3
                any_function(value)
        default:
                value = -1
        }
Остальные комбинации запрещены и останавливают работу парсера.

Несколько сложных конструкций:
  Блок первого уровня
    Блок второго уровня
      Блок третьего уровня
  ^-----continue до первого уровня
    ^---continue до второго уровня
  v-----break по первый уровень
    v---break по второй уровень

~~~~    ~~~~    ~~~~    ~~~~    ~~~~    ~~~~    ~~~~    ~~~~
toBase64(
    header
):
    b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="
    enc = ""
    i = 0
        o1 = this.charCodeAt(i++)
        o2 = this.charCodeAt(i++)
        o3 = this.charCodeAt(i++)
        bits = o1 << 16 | o2 << 8 | o3
        h1 = bits >> 18 & 0x3F
        h2 = bits >> 12 & 0x3F
        h3 = bits >> 6 & 0x3F
        h4 = bits & 0x3F
        enc + b64.charAt(h1) + b64.charAt(h2) + b64.charAt(h3) + b64.charAt(h4)
        (i < this.length)
    (this.length % 3)
    ====1
    ....enc = enc.slice(0, -2) + "=="
    ====2
    ....enc = enc.slice(0, -1) + "="
....header + ";base64," + enc

~~ ~~ ~~ ~~
toBase64(
  header
):
  b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="
  enc = ""
  i = 0
    o1 = this.charCodeAt(i++)
    o2 = this.charCodeAt(i++)
    o3 = this.charCodeAt(i++)
    bits = o1 << 16 | o2 << 8 | o3
    h1 = bits >> 18 & 0x3F
    h2 = bits >> 12 & 0x3F
    h3 = bits >> 6 & 0x3F
    h4 = bits & 0x3F
    enc + b64.charAt(h1) + b64.charAt(h2) + b64.charAt(h3) + b64.charAt(h4)
    (i < this.length)
  %(this.length % 3)
  %1 == 1
  ..enc = enc.slice(0, -2) + "=="
  %1 == 2
  ..enc = enc.slice(0, -1) + "="
..header + ";base64," + enc


Вот не понимаю, почему ни в каких языках не используется  компактное описание очевидных математических функций.
Например, если x - доступ к элементу i-му элементу массива x, тогда как голое можно было бы использовать за abs(i).
Эзотерический поискФорумСобрание заблуждений

Тема в архиве.