• aka © (26.01.17 16:11) [0]
    Признавайтесь кто по молодости "баловался" сей утопической затеей?
    Заглянул на днях в свой старенький винчестер и нашел архив со своими исходниками. В общем я дошел до такого:


    module m1;

    #console;

    var
     int i,j,k[10];

    main
     while(i < 7) {
       j = 0;
       while(j < 8) {
         j = j + 1;
         k[0] = k[0] + j + i;
         k[0] = k[5-5] + 99;
       }
       i = i + 1;
     }
    end;
     

    В исходниках интерпретатора сейчас вообще разобраться не могу )
  • Dimka Maslov © (26.01.17 17:16) [1]
    С 1999 года балуюсь. Вполне прикладная задача, но не как утопическое баловство. Более того прямо сейчас сижу и допиливаю новый функционал.
  • Rouse_ © (26.01.17 17:21) [2]
    Постоянно занимаюсь, применяю в боевых проектах.
    А смысл вопроса-то ?
  • картман © (26.01.17 22:04) [3]

    > применяю в боевых проектах

    надеюсь, одним(языком) не ограничился?
  • aka © (26.01.17 22:51) [4]

    > Dimka Maslov ©   (26.01.17 17:16) [1]
    >
    > С 1999 года балуюсь. Вполне прикладная задача, но не как
    > утопическое баловство. Более того прямо сейчас сижу и допиливаю
    > новый функционал.

    И что полнофункциональный ЯП? Речь ведь об этом, а не мелком скриптообразном встроенном языке для какой то одной системы.


    > Rouse_ ©   (26.01.17 17:21) [2]
    >
    > Постоянно занимаюсь, применяю в боевых проектах.
    > А смысл вопроса-то ?

    Ну, к примеру, у меня в юнности была мечта написать именно полнофункциональный ЯП общего назначения.

    >применяю в боевых проектах.
    Ну речь ведь о встроенных скриптах наверное?

    >А смысл вопроса-то.
    Интересует кто какого функционала достиг в своих разработках, ну не реализовали ли вы же ООП итд.
  • Dimka Maslov © (26.01.17 22:59) [5]

    > И что полнофункциональный ЯП?


    Ну не то, чтобы полнофункциональный, но и не мелкий скриптообразный встроенный язык. Он обладает достаточным функционалом для решаемых задач, а вот ООП в нём сознательно недоразвит, хотя некоторые зачатки присутствуют. Используется для автоматизации инженерных расчётов в при проектировании мостов и гражданских сооружений.
  • Юрий Зотов © (26.01.17 23:06) [6]
    В свое время разработал TDL (Template Definition Laguage - язык описания шаблонов) и написал его интерпретатор.

    Язык, как это следует из его названия, позволял определить некий текстовый шаблон, а интерпретатор превращал этот шаблон в любой исходный код  (Delphi, C, SQL...). Нечто вроде Lex & Yacc.

    Использовалось в корпоративном проекте.

    PS
    Эх, было время... а теперь - тоска, сплошь одна рутинная прикладуха, серьезных задач нет...
  • Юрий Зотов © (26.01.17 23:09) [7]
    > ну не реализовали ли вы же ООП

    ООП - нет, а вот СУБД - было дело. В 80-х еще.
  • Сергей Суровцев © (26.01.17 23:35) [8]
    >aka ©   (26.01.17 22:51) [4]
    >И что полнофункциональный ЯП?

    Вполне себе полнофункциональный интерпретатор. С функциями, процедурами, отладчиком. ООП не поддерживает т.к. в задачах, для которых создавался это не нужно.
  • Kerk © (26.01.17 23:43) [9]
    Мои эксперименты чем-то таким ограничились. Правда, парсер мне уже лень было писать :)
    http://roman.yankovsky.me/?p=467

    С предметно-ориентированными языками и встроенными скриптовыми системами все понятно. Там сугубо практическая мотивация. Но разработке языков общего назначения главный вопрос: а нафига? То есть: в чем собственно идея-то? Ну например, кому-то не хватает множественного наследования в Delphi и он делает свой Delphi с множественным наследованием. Это интересно. По крайней мере чтоб поиграться и посмотреть что получится. А язык ради языка - это разве что для самообразования.
  • Jeer © (27.01.17 04:48) [10]
    У меня вполне себе используется свой script-pascal.
    Пример: Описание генерации сигнала.
    http://savepic.ru/12768352.png
  • Pavia © (27.01.17 05:57) [11]
    Моё творение.
    http://compiler.forumcity.com/viewtopic.php?t=17&sid=ac87dbdb58a4c630a17caecc26292a86

    Есть функции, структуры, указатели. ООП не делал.
  • DayGaykin © (27.01.17 08:31) [12]

    > Эх, было время... а теперь - тоска, сплошь одна рутинная
    > прикладуха, серьезных задач нет...

    Я уже скучаю по тоске.
  • Andryk © (27.01.17 13:56) [13]
    Ну, например, в Scala очень распространено для библиотек-фреймворков создавать свой DSL, который можно использовать для разработки проектов использующих эти фреймворки.
    Скриптовые языки тоже там пишутся на раз-два, мне очень понравилось делать парсеры на Parser Combinators.
  • sniknik © (27.01.17 14:48) [14]
    > ООП - нет, а вот СУБД - было дело. В 80-х еще.
    в институте делал курсовую подруге знакомого, на курс старше. ну как делал, дали файл, в нем что-то похожее на код, и знание что он должен делать, попросили разобраться что и как. ну разобрался, написал интерпретатор на используемые в коде функции, вместо таблицы файл с рекордами, в общем под моим интерпретатором выданный файл делал все что нужно, подруга все сдала на отлично, хотя так и не смогла объяснить как у нее, что работает (не так у остальных, но и запущенное преподом тоже работало, т.что все нормально).
    а на следующем семестре мы начали учить фохпро, и тут меня осенило... :).
  • Юрий Зотов © (27.01.17 15:29) [15]
    > sniknik ©   (27.01.17 14:48) [14]

    Хех... так ту СУБД я тоже делал для дамы и тоже в рамках ее проекта (правда, дипломного).

    Шерше ля фам...
  • aka © (01.02.17 12:46) [16]
    Добавил на днях if...else

    Вот этот код моего интерпретатора выполняется в 150 раз медленнее аналогичного кода в D7, интересно - это нормально или медленно?    
    module m1;

    #console;

    var
     int i,n,k;

    main
     while(i < 100000000) {
       if (i > 5) { n = n + 1;}

       if (i > 50) { k = k + 1;}
       if (i > 500) { k = k - 1;}
       if (i > 5000) { k = k + 1;}
       i = i + 1;
     }

     println(n);
     println(k);
    end;

  • Dimka Maslov © (01.02.17 13:35) [17]

    > Вот этот код моего интерпретатора выполняется в 150 раз
    > медленнее аналогичного кода в D7, интересно - это нормально
    > или медленно?


    на днях заметил, что код на C++ (в частности интерпретатор своего ЯП) выполняется в 100 (сто) раз медленнее, будучи скомилированным в режиме Debug, нежели в режиме Release...
  • aka © (01.02.17 15:14) [18]
    Тестировала только что еще раз:

    D7 : 1
    Свой ЯП : 150
    PHP(c командной строки) : 300
  • Pavia © (01.02.17 15:44) [19]
    Говорят что VB 150 выдаёт.
  • Jeer © (02.02.17 02:07) [20]
    aka ©   (01.02.17 15:14) [18]
    Так "добавил" или "тестировала"? :)
  • Наиль © (02.02.17 06:48) [21]
    Oracle хочет лишить всех такой радости, как разработка собственного компилятора.
    Зато можно будет придумывать языки хоть каждый день, и писать программы смешивая любые языки. Т.е. можно будет написать программу на ruby, которая будет использовать модули на языках python и pascal: https://habrahabr.ru/post/319424/
  • Eraser © (02.02.17 12:02) [22]
    в конце останется только один.
  • Игорь Шевченко © (02.02.17 12:29) [23]

    > в конце останется только один.


    C++
  • Kerk © (02.02.17 13:16) [24]

    > Наиль ©   (02.02.17 06:48) [21]

    По ассоциации вспомнилась эта вот штука https://www.jetbrains.com/mps/
  • Jeer © (02.02.17 23:17) [25]
    Удалено модератором
    Примечание: Выражения выбираем, не в пивной
  • DayGaykin © (02.02.17 23:25) [26]

    > Eraser ©   (02.02.17 12:02) [22]
    > в конце останется только один.
    > Игорь Шевченко ©   (02.02.17 12:29) [23]
    >
    > > в конце останется только один.
    >
    >
    > C++

    Мечты-мечты
  • Германн © (03.02.17 02:40) [27]

    > Eraser ©   (02.02.17 12:02) [22]
    >
    > в конце останется только один.
    > Игорь Шевченко ©   (02.02.17 12:29) [23]
    >
    >
    > > в конце останется только один.
    >
    >
    > C++

    Не дождётесь!
    :)
  • aka © (03.02.17 09:02) [28]
    Нужно будет добавить многомерные массивы (реализованы только одномерные). Если массив в памяти хранится линейно, то для двумерного массива A[3][5] ячейка с адресом A[2][3] будет вычисляться по формуле: 2 * 5 + 3 = 13. Т.е. это будет ячейка №13 из массива из 15 ячеек.
    Какая будет формула для N - мерного массива?
  • DayGaykin © (03.02.17 12:23) [29]
    X[n] + S[n]*( X[n-1] + S[n-1] * (...*( X[1] + S[1] * X[0] ) ) )

    Оставь это программисту.
  • aka © (03.02.17 12:41) [30]

    > Оставь это программисту.

    Ниче себе! Какой ты молодец.

    Да я как бы, наверное, и без вашей профессиональной консультации обощелся. Запостил так - для поддержания беседы.
  • DayGaykin © (03.02.17 16:59) [31]

    > aka ©   (03.02.17 12:41) [30]

    Что ты ребенка включил?

    Сделай одномерный массив, а многомерный пусть программист сам делает.
  • Kerk © (03.02.17 17:12) [32]
    Э, так можно сказать "сделай функции с одним параметром, а остальное пусть сам программист делает" :) Куда ж мы без синтаксического сахарка?
  • DayGaykin © (03.02.17 17:14) [33]

    > Kerk ©   (03.02.17 17:12) [32]
    > Э, так можно сказать "сделай функции с одним параметром,
    >  а остальное пусть сам программист делает" :) Куда ж мы
    > без синтаксического сахарка?

    Никогда не встречал в реальной жизни многомерные массивы. А многопараметрные функции встречал.

    Лучше finally добавили бы в c++.
  • Dimka Maslov © (03.02.17 17:20) [34]

    > Никогда не встречал в реальной жизни многомерные массивы

    Таки бывают, но я никогда не встречал более чем трёхмерные


    > Лучше finally добавили бы в c++.


    Деструктор объекта и есть finally.
  • DayGaykin © (03.02.17 17:25) [35]

    > > Лучше finally добавили бы в c++.
    >
    >
    > Деструктор объекта и есть finally.

    Знаю и это аргумент против добавления finally, но деструктор - не всегда удобно
  • Inovet © (03.02.17 21:48) [36]
    > [34] Dimka Maslov ©   (03.02.17 17:20)
    > Деструктор объекта и есть finally.

    Ты путаешь или умышленно? Хотя, всё в мире есть последовательное выполнение пограммы.
  • Dimka Maslov © (03.02.17 22:57) [37]

    > но деструктор - не всегда удобно

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


    > Inovet ©   (03.02.17 21:48) [36]


    А чего тут путать. Деструктор объекта вызвается при выходе из контекста, где этот объект создан. Практически полный эквивалент finally, который в подавляющем большинстве случаев используется для уничтожения объекта.
  • aka © (03.02.17 23:09) [38]

    > Jeer ©   (02.02.17 02:07) [20]
    >
    > aka ©   (01.02.17 15:14) [18]
    > Так "добавил" или "тестировала"? :)

    добавил, потом тестеровал


    module m1;

    #console;

    var
     int i, b, a, c[10],h;

    main
     while (a < 56) {
       b = 17 + a + 3;
       c[5] = 87 + 345 + 15;
       c[0] = 3 + 3;
       c[0 + 1] = 2;
       if(a > 26) {
         c[5] = c[5] + 2 + 2;
         c[0] = 19;
       }
    else {
         if (a < 5) {a = 4;}
    else {b = 900;}
         c[5] = c[5] - 3;
         c[0] = c[0] + 2;
         if (a < 3) {a = 3;} else {
           while(h < 89) {
             h = h + 4;
             c[c[6]] = c[c[6]] + 12;
           }


         }
       }
       c[6] = 7;
       c[7] = 8;
       c[c[c[6]]] = c[c[c[6]]] + c[5] + b + 2 + c[c[6]] + 16 + c[c[6]];
       a = a + 1;
     }

     while(i < 100) {
        c[c[c[6]]] = c[c[c[6]]] + i;
        i = i + 1;
     }


     println(c[c[c[6]]]);
     println(b);
     println(h);

  • aka © (03.02.17 23:16) [39]
    А вообще интересно, интерпретатор такой функциональности, как в [38] по нынешним институтским меркам это уровень чего? Курсовой, дипломной, научной работы? Типа данных там два: int и boolean, строк нет, массивы одномерные.
  • DayGaykin © (04.02.17 00:02) [40]
    В чем новизна?
  • Inovet © (04.02.17 01:57) [41]
    > [37] Dimka Maslov ©   (03.02.17 22:57)
    > Деструктор объекта вызвается при выходе из контекста, где
    > этот объект создан.

    За что я люблю Си++.
  • Сергей Суровцев © (04.02.17 02:03) [42]
    >aka ©   (03.02.17 23:16) [39]

    Гораздо интереснее внутряшка. Т.е. варианты способов хранения имен, типов и значений переменных и массивов, преобразование типов, массивы с разнотипными данными и т.д. А синтаксический разбор он и в Африке такой-же.
  • Dimka Maslov © (04.02.17 11:00) [43]

    aka ©   (03.02.17 23:16) [39]


    На курсовик потянет
  • Юрий Зотов © (04.02.17 11:45) [44]
    > интерпретатор такой функциональности, как в [38] по нынешним
    > институтским меркам это уровень чего? Курсовой, дипломной,
    >  научной работы?


    Науки здесь точно нет, поскольку нет новизны - ни в самой задаче, ни в методе ее решения.

    > Типа данных там два: int и boolean, строк
    > нет, массивы одномерные.


    То есть, это очень сильно обрезанный интерпретатор. А раз он очень сильно обрезанный, значит, и практической ценности тоже не имеет. Соответственно, и на диплом тоже не потянет.

    Остается курсовик.
  • aka © (04.02.17 16:32) [45]

    > Остается курсовик.

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


    module m1;

    #console;

    var
     int a[10];
     int n, max, maxpos;
     int i, j, buf;

    main
     while (n < 10) {
       readln(a[n]);
       n = n + 1;
     }

     
     while (i < 10) {
       max = a[i];
       maxpos = i;
       
       j = i + 1;
       while (j < 10) {
         if (max > a[j]) {
           max = a[j];
           maxpos = j;
         }
     
         j = j + 1;
       }
     
       buf = a[i];
       a[i] = a[maxpos];
       a[maxpos] = buf;
       
       i = i + 1;
     }

     n = 0;
     while (n < 10) {
       println(a[n]);
       n = n + 1;
     }

    end;

  • Юрий Зотов © (04.02.17 16:40) [46]
    А предупреждения выдаются (переменные n и i не инициализированы перед циклами while) ?
  • aka © (04.02.17 16:44) [47]

    > Юрий Зотов ©   (04.02.17 16:40) [46]
    >
    > А предупреждения выдаются (переменные n и i не инициализированы
    > перед циклами while) ?


    Нет не выдаются.
    При запуске все переменные имеют нулевые значения.
  • Dimka Maslov © (04.02.17 17:34) [48]

    > Скрипт сортировки


    Надо стремиться, чтобы скрипт сортировки выглядел примерно так:

    #array a(10) of {rnd(10.0)}
    #sortup(a)

    Это не так изящно и красиво, но имеет бóльшую практическую ценность.
  • Inovet © (04.02.17 18:11) [49]
    > [47] aka ©   (04.02.17 16:44)
    > При запуске все переменные имеют нулевые значения.

    Чем нулевые отличаются от ненулевых?
  • aka © (04.02.17 18:58) [50]

    > Чем нулевые отличаются от ненулевых?

    ?
  • Jeer © (05.02.17 03:54) [51]
    >Чем нулевые отличаются от ненулевых?

    Для расчетов динамических процессов - это важно (начальные условия).
    Во всех остальных случаях- нет никакой разницы между нулем и не нулем.
  • aka © (07.02.17 12:39) [52]

    > aka ©   (01.02.17 15:14) [18]
    >
    > Тестировал только что еще раз:
    >
    > D7 : 1
    > Свой ЯП : 150
    > PHP(c командной строки) : 300



    > То есть, это очень сильно обрезанный интерпретатор. А раз
    > он очень сильно обрезанный, значит, и практической ценности
    > тоже не имеет. Соответственно, и на диплом тоже не потянет.
    >
    >
    > Остается курсовик.

    Иду 7-ми мильными, добавил действия с плавающей точкой. Но теперь:
    D7 : 1
    Свой ЯП : 180
    PHP(c командной строки) : 300
  • Юрий Зотов © (07.02.17 13:04) [53]
    > добавил действия с плавающей точкой

    Надеюсь, Вы сначала добавили их в формальную спецификацию языка, и только после этого  - в интерпретатор?
  • картман © (07.02.17 16:22) [54]

    > сначала добавили их в формальную спецификацию языка, и только
    > после этого  - в интерпретатор?
    >

    и обернуть в транзакцию непременно
  • aka © (09.02.17 23:11) [55]

    > Надеюсь, Вы сначала добавили их в формальную спецификацию
    > языка, и только после этого  - в интерпретатор?

    спецификация потом :)

    Сейчас разработка на стадии унарного минуса, есть вариант сделать как во всех языках т.е.

    а := -b {что дает минус}
    а := --b {что дает плюс}
    а := ---b {что дает минус}
    а := ----b {что дает плюс}

    или запретить более одного унарного минуса, но будет ли это правильно - вопрос.
    С одной стороны - это возможность всех языков, а с другой - не нужный избыточный огород. Как думаете?
  • Kerk © (09.02.17 23:15) [56]
    Так а зачем вводить сугубо искусственные ограничения?

    Выражение может начинаться с унарного минуса.
    Унарный минус ставится перед выражением.

    Какой вывод?
  • aka © (09.02.17 23:31) [57]

    >  Kerk ©   (09.02.17 23:15) [56]
    >
    > Так а зачем вводить сугубо искусственные ограничения?
    >
    > Выражение может начинаться с унарного минуса.
    > Унарный минус ставится перед выражением.
    >
    > Какой вывод?

    Ну так даже проще в реализации. Но это с родни бессмысленности лишних символов, сюда же можно отнести пустые выражение (когда можем наставить сколь угодно ;;;;;;;). А зачем?
  • Юрий Зотов © (09.02.17 23:38) [58]
    > спецификация потом

    Огромное заблуждение. Писать интерпретатор, не имея формального описания языка - это называется "делаю то, сам не знаю что". Сразу можно сказать, что в таком интерпретаторе будет куча глюков Не Вы первый делаете эту ошибку и результат всегда один и тот же.

    Кстати, именно потому, что формального описания еще нет у Вас и возникли затруднения с унарными операциями.
  • aka © (09.02.17 23:51) [59]

    > Кстати, именно потому, что формального описания еще нет
    > у Вас и возникли затруднения с унарными операциями.

    да нет затруднений, есть просто вопрос [55].
    > Огромное заблуждение. Писать интерпретатор, не имея формального
    > описания языка - это называется "делаю то, сам не знаю что"

    А на счет этого даже спорить не буду. Но все дело в том, что занимаюсь я этим сугубо в свое удовольствие. И неделю назад не было не циклов не if else. Просто летел вперед, писал код под воздействием большого интереса - как это все можно реализовать программно.
  • Юрий Зотов © (10.02.17 00:06) [60]
    > aka ©   (09.02.17 23:51) [59]

    На соревнованиях по спортивному ориентированию один спортсмен бежал намного быстрее другого спортсмена, но все равно ему проиграл. На недоуменный вопрос "как же могло так получиться?" второй спортсмен ответил: "Ты нарушил главное правило - не беги быстрее, чем думает твоя голова".

    А гонщики говорят так: "Нельзя ехать быстрее, чем тебе позволяют твои тормоза".

    Понимаете, о чем я?
    :o)
  • aka © (10.02.17 09:10) [61]

    > Понимаете, о чем я?
    > :o)

    Конечно понимаю, но такая тактика тоже оправдана и так я делал не раз. Сначала забегал вперед в "неизвестность" осмысляя основные моменты, а вторым заходом переписывал все на чистовик.

    Но что конкретно люди думают по поводу [55],[57], так пока и не услышал
  • Pavia © (10.02.17 09:35) [62]

    > Ну так даже проще в реализации. Но это с родни бессмысленности
    > лишних символов, сюда же можно отнести пустые выражение
    > (когда можем наставить сколь угодно ;;;;;;;). А зачем?

    Глупости говорите. Вам для разбора выражений нужен автомат с магазинной памятью. А там один минус или десять нет никакой разницы.
    Я понимаю если бы вы спросили про символы с правой рекурсий их действительно проще ограничить одним уровнем.
  • Юрий Зотов © (10.02.17 09:56) [63]
    > aka ©   (10.02.17 09:10) [61]

    > Но что конкретно люди думают по поводу [55],[57], так пока
    > и не услышал


    А между ответ уже был в [56].

    Нет никакой разницы, сколько и каких унарных операций идут подряд. И если бы Вы имели формальную спецификацию языка, то из нее это было бы сразу видно, поэтому вопрос [55] даже и не возник бы (о чем и было сказано в [58]).
  • Юрий Зотов © (10.02.17 09:57) [64]
    * А между тем ...
  • Сергей Суровцев © (10.02.17 10:03) [65]
    >Юрий Зотов ©   (10.02.17 00:06) [60]

    А имеется в природе литература, в которой подробно описан процесс создания именно интерпретаторов? Только полноценных, а не "2+2 работает, а дальше по аналогии". Так чтобы с пользовательскими функциями и т.д. От самого начала и до полного завершения, а не до уровня окончания синтаксического разбора. Вот по компиляторам есть несколько, а по интерпретаторам не встречал.
  • Юрий Зотов © (10.02.17 10:10) [66]
    > Сергей Суровцев ©   (10.02.17 10:03) [65]

    Я тоже не встречал.
  • Игорь Шевченко © (10.02.17 10:16) [67]
    Сергей Суровцев ©   (10.02.17 10:03) [65]

    Начать с того, что по своей сути интерпретатор от компилятор несильно отличается.

    У Шилдта был пример разработки интерпретатора Basic.
    Герберт Шилдт, Язык программирования С, какое-то очень древнее издание.
  • Pavia © (10.02.17 10:18) [68]

    > Сергей Суровцев ©   (10.02.17 10:03) [65]


    > Вот по компиляторам есть несколько, а по интерпретаторам
    > не встречал.

    Сильно не интересовался, меня больше компиляторы интересовали.

    Не совсем. Есть книга "Практическое программирование на Tcl и Tk" в нём описывается устройство интерпретатора с использованием пользовательских функций и процесс их внесения в интерпретатор. Грамматический анализатор там тоже описан, благодаря простой грамматики он там занимает менее 1000 строк.

    Но я вам советую обратить внимание на цикл статей "@tyomitch"
    https://habrahabr.ru/users/tyomitch/topics/page5/
  • Сергей Суровцев © (10.02.17 10:26) [69]
    >aka ©   (09.02.17 23:11) [55]
    По итогу унарный минус должен быть один. Перед выражением.
    Игры с "-- = +" до добра не доведут.
    Здесь есть момент восприятия:
    --х что это
    1) префиксный декремент
    2) сложение унарных минусов в плюс
    3) ошибка ввода

    А варианты интерпретации:
    ---х даже представить страшно

    Все операции с изменение знака через умножение на "-1".

    А вещи типа: ";;;;" просто проглатывать как пустые строки.
    Только помните, что когда выдаете сообщения об ошибке в такой-то строке, пустые строки с переводом строки тоже надо считать.
  • Inovet © (10.02.17 10:54) [70]
    > [69] Сергей Суровцев ©   (10.02.17 10:26)
    > --х что это
    > 1) префиксный декремент
    > 2) сложение унарных минусов в плюс
    > 3) ошибка ввода

    Именно 1, если приоритет у него выше, а ниже делать его не надо, чтобы не было ещё много неясностей помимо 2 и 3..
  • Inovet © (10.02.17 10:57) [71]
    > [69] Сергей Суровцев ©   (10.02.17 10:26)
    > А вещи типа: ";;;;" просто проглатывать как пустые строки

    Типа отдельно их что ли обрабатывать? Нафига?

    Ну и с унарный минус имножением заменять неразумно, к тому же унарный минус у -1*x придётся тоже отдельно обрабатывать? Или в числах не считается - числа исключение?:)
  • Сергей Суровцев © (10.02.17 11:18) [72]
    >Inovet ©   (10.02.17 10:54) [70]
    >Именно 1,

    Естественно это префиксный декремент, если таковой вообще предусмотрен в спецификации данного языка. А если нет? А если, как выясняется: "спецификация потом :)"

    >aka ©   (09.02.17 23:11) [55]
    >а := --b {что дает плюс}

    >Inovet ©   (10.02.17 10:57) [71]
    >Типа отдельно их что ли обрабатывать? Нафига?

    Естественно не отдельно.
    Но я привел пример случая, когда по ним нельзя считать количество строк.

    >Ну и с унарный минус имножением заменять неразумно
    Естественно неразумно. Поэтому этого никто и не предлагает. Предлагается запрет как таковой на 2 подряд унарные операции.
  • Сергей Суровцев © (10.02.17 11:27) [73]
    >Игорь Шевченко ©   (10.02.17 10:16) [67]
    >Pavia ©   (10.02.17 10:18) [68]

    Спасибо за информацию.

    >Игорь Шевченко ©   (10.02.17 10:16) [67]
    >Начать с того, что по своей сути интерпретатор от компилятор несильно отличается.

    В общем и целом да, до какого-то момента и вообще не отличаются. Но дальше "дьявол в деталях".
  • Сергей Суровцев © (10.02.17 11:40) [74]
    >Inovet ©   (10.02.17 10:54) [70]
    x = 5;
    ---x:
    --(-x) = -6
    -(--x) = -4

    ----x = ?
    ---------------------x = ????????????
    Конечно, все это можно обрабатывать. Академически. Но нафига? Для нормального языка возможность такой конструкции без ошибки - зло.
  • Inovet © (10.02.17 12:00) [75]
    > [74] Сергей Суровцев ©   (10.02.17 11:40)
    > Для нормального языка возможность такой конструкции без
    > ошибки - зло.

    Первое не зло, но не надо так делать, 2 и 3 и так ошибки - куда присвоение происходит?
    Ну и отдельно
    --(-x)
    ----x
    ---------------------x
    Хоть и не ошибка, но тоже не надо так делать.
  • Сергей Суровцев © (10.02.17 12:31) [76]
    >Inovet ©   (10.02.17 12:00) [75]
    >2 и 3 и так ошибки - куда присвоение происходит?
    Это же не готовый код, а пример вариантов восприятия.

    >Хоть и не ошибка, но тоже не надо так делать
    А вот это уже не разговор.
    "Мы написали язык, в котором вы можете использовать такую вот косячную конструкцию, но убедительно вас просим - не надо так делать"

    В языке все должно быть предельно понятно и лаконично. Любая конструкция нужна для определенной цели, прозрачна, однозначна в восприятии и исполнении. Если заранее известно что "не надо так делать", значит не надо давать возможности "так делать".
  • aka © (10.02.17 13:10) [77]

    > В языке все должно быть предельно понятно и лаконично. Любая
    > конструкция нужна для определенной цели, прозрачна, однозначна
    > в восприятии и исполнении. Если заранее известно что "не
    > надо так делать", значит не надо давать возможности "так
    > делать".


    В чем и вся суть вопроса [55]


    > Pavia ©   (10.02.17 09:35) [62]
    > Глупости говорите. Вам для разбора выражений нужен автомат
    > с магазинной памятью. А там один минус или десять нет никакой
    > разницы.

    Зачем эти отступления? Все это понятно. Но был конкретный вопрос - разрешать или нет городить ненужный огород из минусов. Разницы автомату нет, но можно ограничится одним, более одного = ошибка.
  • dmk © (10.02.17 13:19) [78]
    >--(-x) = -6
    >-(--x) = -4
    1 минус достаточно (имхо). Неужели есть практика необходимости в большом кол-ве минусов? Ведь всего 2 варианта или минус или нет.
  • Сергей Суровцев © (10.02.17 13:30) [79]
    >aka ©   (10.02.17 13:10) [77]

    Дело не в минусах. А в операциях. --х судя по Сишному синтаксису интерпретатора тоже предполагается. Как и ++х. Дело в том, чтобы не разрешать 2 и более подряд унарных операций. Кому сильно надо, есть скобки.
  • Игорь Шевченко © (10.02.17 13:51) [80]
    Сергей Суровцев ©   (10.02.17 11:27) [73]


    > В общем и целом да, до какого-то момента и вообще не отличаются.
    >  Но дальше "дьявол в деталях".


    Да какой там дьявол. Получив синтаксическое дерево, ты не генерацией кода занимаешься, а выполнением операций языка.
  • Сергей Суровцев © (10.02.17 14:18) [81]
    >Игорь Шевченко ©   (10.02.17 13:51) [80]
    >ты не генерацией кода занимаешься, а выполнением операций языка.

    Вот именно. "Занимаешься", "ты", пошагово, построчно, сам, лично, ручками. По каждой операции. И вопросы хранения, доступа, обработки переменных, массивов, совместимости типов, вызова функций, проверка параметров, анализ и сообщения об ошибках и т.д. это только твое личное дело. И все это хозяйство не в виде скомпилированного кода, а в виде исходного. И надо чтобы по времени все это обрабатывалось приемлемо шустро. Тут и возникают вопросы оптимальной реализации.
  • Игорь Шевченко © (10.02.17 14:34) [82]

    > И все это хозяйство не в виде скомпилированного кода, а
    > в виде исходного.


    Все это хозяйство в виде синтаксического дерева.


    > И вопросы хранения, доступа, обработки переменных, массивов,
    >  совместимости типов, вызова функций, проверка параметров,
    >  анализ и сообщения об ошибках и т.д. это только твое личное
    > дело


    Часть этих проблем решается на уровне анализа, часть на уровне исполняющей среды.

    Открой для себя Yacc.
  • Сергей Суровцев © (10.02.17 14:39) [83]
    >Юрий Зотов ©   (10.02.17 10:10) [66]
    >Я тоже не встречал.

    Вот это и странно. Большинство современных и популярных языков либо интерпретаторы, либо изначально были таковыми. А хорошей полноценной литературы, посвященной именно этой теме нет. Парадокс.
  • Pavia © (10.02.17 14:42) [84]

    > Сергей Суровцев ©   (10.02.17 13:30) [79]
    > >aka ©   (10.02.17 13:10) [77]Дело не в минусах. А в операциях.
    >  --х судя по Сишному синтаксису интерпретатора тоже предполагается.
    >  Как и ++х. Дело в том, чтобы не разрешать 2 и более подряд
    > унарных операций. Кому сильно надо, есть скобки.

    В Си++ знаки идущие рядом преобразуются в теги ещё на стадии препроцессинга.
    -----ap преобразуется в набор тегов '--' '--' '-' 'ap'
    А вот дальше грамматический анализ проверяет унарность операций. И в данном примере унарный минус тут только один. Но даже если каким-то чудом или за счёт использования пробела их было два. То компилятор бы начал ругаться.

    По поводу запретить две и более унарных знака поддерживаю. Хотя насколько знаю в Си это сделано из-за указателей (унарный оператор '*').
    '**' - это отдельный оператор.
  • Kerk © (10.02.17 14:51) [85]

    > aka ©   (09.02.17 23:31) [57]
    >
    > Ну так даже проще в реализации. Но это с родни бессмысленности
    > лишних символов, сюда же можно отнести пустые выражение
    > (когда можем наставить сколь угодно ;;;;;;;). А зачем?

    С одной стороны да. Но с другой никогда не знаешь каким боком тебе такие упрощения вылезут.

    Например, в Делфи в отличие от С не обязательно писать скобки при вызове функций. В C надо писать
    somefunc()

    ;, а в Делфи хватит и просто
    somefunc;

    . В большинстве случаев. Но в редких случаях в делфи эти скобки писать обязательно. И это вот неединообразие ведет к неочевидным на первый взгляд багам.

    Синтаксис должен быть простым, предсказуемым и единообразным. Действие операторов не должно зависеть от контекста.
  • Сергей Суровцев © (10.02.17 15:12) [86]
    >Игорь Шевченко ©   (10.02.17 14:34) [82]
    >Часть этих проблем решается на уровне анализа, часть на уровне исполняющей среды.

    Игорь, прости, какой "исполняющей среды"?
  • Pavia © (10.02.17 15:13) [87]

    > Сергей Суровцев ©   (10.02.17 14:18) [81]


    > Тут и возникают вопросы оптимальной реализации.

    Наверно такой литературы нет, так как проблема решается сведением до компилятора байт-кода?
    А во вторых многие заваливаются на парсере так как очень большая часть.


    > И вопросы хранения, доступа, обработки переменных,

    Это решается семантическим деревом.


    > совместимости типов

    Решается на этапе преобразование в триграммы вернее в IR (внутренее представление).  


    >  проверка параметров

    Статическая типизация?

    У меня половина компилятора или чуть больше занимает всё это, а парсер меньше половины.
  • Pavia © (10.02.17 15:48) [88]

    > Это решается семантическим деревом.

    Когда строишь это дерево дублирующие данные заменяешь на ссылки.
    Обращение по ссылкам уже оптимально O(1). Поэтому при исполнение всё будет быстро.

    У тебя есть синтаксическое дерево с тегами к примеру 'MyVar'. Ты не знаешь к кой переменной они относятся так как у разных переменных может быть одно имя.
    Надо обойти дерево и заменить теги ссылками на объявления переменных. Которое храниться в этом же дереве.

    Запретив вложенные функции такой поиск объявлений сводиться к просмотру 4-х списков. Поиск в которых можно свести к O(1) при желании (Хэш таблицы).
    А если не заморачиваться, то обход дерева с возвратом. Возврат нужен для поиска первого объявления так как бывают перекрывающиеся имена.  
    Так как я не запрещал вложенные пришлось много кода править. Но не так много как кодогенирация.
  • Игорь Шевченко © (10.02.17 15:49) [89]
    Сергей Суровцев ©   (10.02.17 15:12) [86]


    > Игорь, прости, какой "исполняющей среды"?


    Обычно выход интерпретатора - это набор инструкций для некоторой виртуальной исполняющей среды, которую тем или иным образом эмулируют на конкретном процессоре. Как Java, например.
  • Inovet © (10.02.17 16:07) [90]
    > [76] Сергей Суровцев ©   (10.02.17 12:31)
    > Если заранее известно что "не надо так делать", значит не
    > надо давать возможности "так делать".

    Значит ограничить в чём-то язык. Оно, может, и неплохо. НО, надо это определить в спецификации и без противоречий. А в парсере уже проблем не составит отловить унарный минус и декремент.
  • Inovet © (10.02.17 16:10) [91]
    > [81] Сергей Суровцев ©   (10.02.17 14:18)
    > И все это хозяйство не в виде скомпилированного кода, а
    > в виде исходного.

    Вообще-то "скомпилированного" в дерево.
  • Inovet © (10.02.17 16:12) [92]
    > [83] Сергей Суровцев ©   (10.02.17 14:39)
    > >Юрий Зотов ©   (10.02.17 10:10) [66]
    > >Я тоже не встречал.
    >
    > Вот это и странно. Большинство современных и популярных
    > языков либо интерпретаторы, либо изначально были таковыми.

    Я где-то видел интерпретатор Си. Не у того ли автора, что ИШ привёл?
  • Inovet © (10.02.17 16:13) [93]
    > [84] Pavia ©   (10.02.17 14:42)
    > В Си++ знаки идущие рядом преобразуются в теги ещё на стадии
    > препроцессинга.
    > -----ap преобразуется в набор тегов '--' '--' '-' 'ap'

    Круто.
  • Inovet © (10.02.17 16:15) [94]
    > [84] Pavia ©   (10.02.17 14:42)
    > в Си это сделано из-за указателей

    Вот! Я ждал указателей. Но мы пока про них не говорили, а то и примеры там выше с -(--x) и т.п. вполне рабочие могут оказаться - зависит от типа x.
  • Сергей Суровцев © (10.02.17 16:21) [95]
    >Игорь Шевченко ©   (10.02.17 15:49) [89]
    >Обычно выход интерпретатора - это набор инструкций для некоторой виртуальной исполняющей среды, которую тем или иным образом эмулируют на конкретном процессоре

    Интерпретатор это и есть та самая виртуальная исполняющая среда. На входе там текст исходного кода. На выходе результат его исполнения. В середине либо построчная обработка, либо байт-код, либо JIT-компиляция. Вот в этой середине самое интересное и есть.
  • Inovet © (10.02.17 16:33) [96]
    > [84] Pavia ©   (10.02.17 14:42)
    > '**' - это отдельный оператор.

    Нет - это две операции.
  • Inovet © (10.02.17 16:40) [97]
    > [95] Сергей Суровцев ©   (10.02.17 16:21)
    > В середине либо построчная обработка

    Язык Fort в этом смысле всех уел - и построчная и компиляция.:)
  • Игорь Шевченко © (10.02.17 17:43) [98]
    Сергей Суровцев ©   (10.02.17 16:21) [95]

    Я бы рекомендовал литературу почитать и поизучать примеры готовых продуктов, благо, навалом.
  • Inovet © (10.02.17 17:53) [99]
    > [96] Inovet ©   (10.02.17 16:33)
    > > [84] Pavia ©   (10.02.17 14:42)
    > > '**' - это отдельный оператор.
    >
    > Нет - это две операции.

    А в Фотртане, да.
  • aka © (10.02.17 20:31) [100]

    > Вот это и странно. Большинство современных и популярных
    > языков либо интерпретаторы, либо изначально были таковыми.
    >  А хорошей полноценной литературы, посвященной именно этой
    > теме нет. Парадокс.


    Не переживайте, я как только закончу, все подробно опишу :) Подождите где-то год.
  • Inovet © (10.02.17 21:17) [101]
    > [100] aka ©   (10.02.17 20:31)
    > Подождите где-то год.

    Сам сказал. Время пошло, и "где-то" не считаются.:) Не напрягайся - если тебе это в кайф, так не устанавливай сроки, если работа, так тем более не стал бы здесь говорить.
  • aka © (10.02.17 22:36) [102]

    > Игорь Шевченко ©   (10.02.17 14:34) [82]
    >
    >
    > > И все это хозяйство не в виде скомпилированного кода,
    > а
    > > в виде исходного.
    >
    >
    > Все это хозяйство в виде синтаксического дерева.


    Может быть трехадресный код.
  • aka © (17.02.17 14:35) [103]
    Чисто случайно строки "интересные" получились. На этапе недописанного присвоения одтельного символа.

    module m1;

    #console;

    var
     char str[];

    main
     str[] = "hello";
     str[1] = "ivan";
     println(str[]);
    end;


    вывод: hivan

    Наверное пока так и оставлю :) а потом видно будет.
  • Игорь Шевченко © (17.02.17 14:50) [104]

    > Может быть трехадресный код.


    Мне начинать бояться сразу или можно погодя ?
  • aka © (17.02.17 14:56) [105]

    > Мне начинать бояться сразу или можно погодя ?

    Как хотите. Не я же это придумал.
  • aka © (17.02.17 15:25) [106]

    > Игорь Шевченко ©   (17.02.17 14:50) [104]
    >
    >
    > > Может быть трехадресный код.
    >
    >
    > Мне начинать бояться сразу или можно погодя ?

    Вы что литературу шерстите? :)
Есть новые Нет новых   [134431   +10][b:0.001][p:0.004]