-
Признавайтесь кто по молодости "баловался" сей утопической затеей?
Заглянул на днях в свой старенький винчестер и нашел архив со своими исходниками. В общем я дошел до такого:
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;
В исходниках интерпретатора сейчас вообще разобраться не могу )
-
С 1999 года балуюсь. Вполне прикладная задача, но не как утопическое баловство. Более того прямо сейчас сижу и допиливаю новый функционал.
-
Постоянно занимаюсь, применяю в боевых проектах.
А смысл вопроса-то ?
-
> применяю в боевых проектах
надеюсь, одним(языком) не ограничился?
-
> Dimka Maslov © (26.01.17 17:16) [1]
>
> С 1999 года балуюсь. Вполне прикладная задача, но не как
> утопическое баловство. Более того прямо сейчас сижу и допиливаю
> новый функционал.
И что полнофункциональный ЯП? Речь ведь об этом, а не мелком скриптообразном встроенном языке для какой то одной системы.
> Rouse_ © (26.01.17 17:21) [2]
>
> Постоянно занимаюсь, применяю в боевых проектах.
> А смысл вопроса-то ?
Ну, к примеру, у меня в юнности была мечта написать именно полнофункциональный ЯП общего назначения.
>применяю в боевых проектах.
Ну речь ведь о встроенных скриптах наверное?
>А смысл вопроса-то.
Интересует кто какого функционала достиг в своих разработках, ну не реализовали ли вы же ООП итд.
-
> И что полнофункциональный ЯП?
Ну не то, чтобы полнофункциональный, но и не мелкий скриптообразный встроенный язык. Он обладает достаточным функционалом для решаемых задач, а вот ООП в нём сознательно недоразвит, хотя некоторые зачатки присутствуют. Используется для автоматизации инженерных расчётов в при проектировании мостов и гражданских сооружений.
-
В свое время разработал TDL (Template Definition Laguage - язык описания шаблонов) и написал его интерпретатор.
Язык, как это следует из его названия, позволял определить некий текстовый шаблон, а интерпретатор превращал этот шаблон в любой исходный код (Delphi, C, SQL...). Нечто вроде Lex & Yacc.
Использовалось в корпоративном проекте.
PS
Эх, было время... а теперь - тоска, сплошь одна рутинная прикладуха, серьезных задач нет...
-
> ну не реализовали ли вы же ООП
ООП - нет, а вот СУБД - было дело. В 80-х еще.
-
>aka © (26.01.17 22:51) [4]
>И что полнофункциональный ЯП?
Вполне себе полнофункциональный интерпретатор. С функциями, процедурами, отладчиком. ООП не поддерживает т.к. в задачах, для которых создавался это не нужно.
-
Мои эксперименты чем-то таким ограничились. Правда, парсер мне уже лень было писать :)
http://roman.yankovsky.me/?p=467С предметно-ориентированными языками и встроенными скриптовыми системами все понятно. Там сугубо практическая мотивация. Но разработке языков общего назначения главный вопрос: а нафига? То есть: в чем собственно идея-то? Ну например, кому-то не хватает множественного наследования в Delphi и он делает свой Delphi с множественным наследованием. Это интересно. По крайней мере чтоб поиграться и посмотреть что получится. А язык ради языка - это разве что для самообразования.
-
-
-
> Эх, было время... а теперь - тоска, сплошь одна рутинная
> прикладуха, серьезных задач нет...
Я уже скучаю по тоске.
-
Ну, например, в Scala очень распространено для библиотек-фреймворков создавать свой DSL, который можно использовать для разработки проектов использующих эти фреймворки.
Скриптовые языки тоже там пишутся на раз-два, мне очень понравилось делать парсеры на Parser Combinators.
-
> ООП - нет, а вот СУБД - было дело. В 80-х еще.
в институте делал курсовую подруге знакомого, на курс старше. ну как делал, дали файл, в нем что-то похожее на код, и знание что он должен делать, попросили разобраться что и как. ну разобрался, написал интерпретатор на используемые в коде функции, вместо таблицы файл с рекордами, в общем под моим интерпретатором выданный файл делал все что нужно, подруга все сдала на отлично, хотя так и не смогла объяснить как у нее, что работает (не так у остальных, но и запущенное преподом тоже работало, т.что все нормально).
а на следующем семестре мы начали учить фохпро, и тут меня осенило... :).
-
> sniknik © (27.01.17 14:48) [14]
Хех... так ту СУБД я тоже делал для дамы и тоже в рамках ее проекта (правда, дипломного).
Шерше ля фам...
-
Добавил на днях
if...elseВот этот код моего интерпретатора выполняется в 150 раз медленнее аналогичного кода в D7, интересно - это нормально или медленно?
module m1;
#console;
var
int i,n,k;
main
while(i < 100000000)
if (i > 50)
if (i > 500)
if (i > 5000)
i = i + 1;
}
println(n);
println(k);
end;
-
> Вот этот код моего интерпретатора выполняется в 150 раз
> медленнее аналогичного кода в D7, интересно - это нормально
> или медленно?
на днях заметил, что код на C++ (в частности интерпретатор своего ЯП) выполняется в 100 (сто) раз медленнее, будучи скомилированным в режиме Debug, нежели в режиме Release...
-
Тестировала только что еще раз:
D7 : 1
Свой ЯП : 150
PHP(c командной строки) : 300
-
Говорят что VB 150 выдаёт.
-
aka © (01.02.17 15:14) [18]
Так "добавил" или "тестировала"? :)
-
Oracle хочет лишить всех такой радости, как разработка собственного компилятора.
Зато можно будет придумывать языки хоть каждый день, и писать программы смешивая любые языки. Т.е. можно будет написать программу на ruby, которая будет использовать модули на языках python и pascal:
https://habrahabr.ru/post/319424/
-
в конце останется только один.
-
> в конце останется только один.
C++
-
-
Удалено модератором
Примечание: Выражения выбираем, не в пивной
-
> Eraser © (02.02.17 12:02) [22]
> в конце останется только один.
> Игорь Шевченко © (02.02.17 12:29) [23]
>
> > в конце останется только один.
>
>
> C++
Мечты-мечты
-
> Eraser © (02.02.17 12:02) [22]
>
> в конце останется только один.
> Игорь Шевченко © (02.02.17 12:29) [23]
>
>
> > в конце останется только один.
>
>
> C++
Не дождётесь!
:)
-
Нужно будет добавить многомерные массивы (реализованы только одномерные). Если массив в памяти хранится линейно, то для двумерного массива A[3][5] ячейка с адресом A[2][3] будет вычисляться по формуле: 2 * 5 + 3 = 13. Т.е. это будет ячейка №13 из массива из 15 ячеек.
Какая будет формула для N - мерного массива?
-
X[n] + S[n]*( X[n-1] + S[n-1] * (...*( X[1] + S[1] * X[0] ) ) )
Оставь это программисту.
-
> Оставь это программисту.
Ниче себе! Какой ты молодец.
Да я как бы, наверное, и без вашей профессиональной консультации обощелся. Запостил так - для поддержания беседы.
-
> aka © (03.02.17 12:41) [30]
Что ты ребенка включил?
Сделай одномерный массив, а многомерный пусть программист сам делает.
-
Э, так можно сказать "сделай функции с одним параметром, а остальное пусть сам программист делает" :) Куда ж мы без синтаксического сахарка?
-
> Kerk © (03.02.17 17:12) [32]
> Э, так можно сказать "сделай функции с одним параметром,
> а остальное пусть сам программист делает" :) Куда ж мы
> без синтаксического сахарка?
Никогда не встречал в реальной жизни многомерные массивы. А многопараметрные функции встречал.
Лучше finally добавили бы в c++.
-
> Никогда не встречал в реальной жизни многомерные массивы
Таки бывают, но я никогда не встречал более чем трёхмерные
> Лучше finally добавили бы в c++.
Деструктор объекта и есть finally.
-
> > Лучше finally добавили бы в c++.
>
>
> Деструктор объекта и есть finally.
Знаю и это аргумент против добавления finally, но деструктор - не всегда удобно
-
> [34] Dimka Maslov © (03.02.17 17:20)
> Деструктор объекта и есть finally.
Ты путаешь или умышленно? Хотя, всё в мире есть последовательное выполнение пограммы.
-
> но деструктор - не всегда удобно
согласен, но выкрутиться можно. А вот отсутствие виртуальных конструкторов и создание объекта через конструктор, объявленный в классе-предке заставляет изголяться по полной.
> Inovet © (03.02.17 21:48) [36]
А чего тут путать. Деструктор объекта вызвается при выходе из контекста, где этот объект создан. Практически полный эквивалент finally, который в подавляющем большинстве случаев используется для уничтожения объекта.
-
> 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) else else
c[5] = c[5] - 3;
c[0] = c[0] + 2;
if (a < 3) else
}
}
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)
println(c[c[c[6]]]);
println(b);
println(h);
-
А вообще интересно, интерпретатор такой функциональности, как в [38] по нынешним институтским меркам это уровень чего? Курсовой, дипломной, научной работы? Типа данных там два: int и boolean, строк нет, массивы одномерные.
-
В чем новизна?
-
> [37] Dimka Maslov © (03.02.17 22:57)
> Деструктор объекта вызвается при выходе из контекста, где
> этот объект создан.
За что я люблю Си++.
-
>aka © (03.02.17 23:16) [39]
Гораздо интереснее внутряшка. Т.е. варианты способов хранения имен, типов и значений переменных и массивов, преобразование типов, массивы с разнотипными данными и т.д. А синтаксический разбор он и в Африке такой-же.
-
aka © (03.02.17 23:16) [39]
На курсовик потянет
-
> интерпретатор такой функциональности, как в [38] по нынешним
> институтским меркам это уровень чего? Курсовой, дипломной,
> научной работы?
Науки здесь точно нет, поскольку нет новизны - ни в самой задаче, ни в методе ее решения.
> Типа данных там два: int и boolean, строк
> нет, массивы одномерные.
То есть, это очень сильно обрезанный интерпретатор. А раз он очень сильно обрезанный, значит, и практической ценности тоже не имеет. Соответственно, и на диплом тоже не потянет.
Остается курсовик.
-
> Остается курсовик.
Курсовик, так курсовик. Но у меня прямо какая-то детская радость от того, что это все работает. Стоило только взяться.
Скрипт сортировки у меня вызывает оргазм.
module m1;
#console;
var
int a[10];
int n, max, maxpos;
int i, j, buf;
main
while (n < 10)
while (i < 10)
j = j + 1;
}
buf = a[i];
a[i] = a[maxpos];
a[maxpos] = buf;
i = i + 1;
}
n = 0;
while (n < 10)
end;
-
А предупреждения выдаются (переменные n и i не инициализированы перед циклами while) ?
-
> Юрий Зотов © (04.02.17 16:40) [46]
>
> А предупреждения выдаются (переменные n и i не инициализированы
> перед циклами while) ?
Нет не выдаются.
При запуске все переменные имеют нулевые значения.
-
> Скрипт сортировки
Надо стремиться, чтобы скрипт сортировки выглядел примерно так:
#array a(10) of {rnd(10.0)}
#sortup(a)
Это не так изящно и красиво, но имеет бóльшую практическую ценность.
-
> [47] aka © (04.02.17 16:44)
> При запуске все переменные имеют нулевые значения.
Чем нулевые отличаются от ненулевых?
-
> Чем нулевые отличаются от ненулевых?
?
-
>Чем нулевые отличаются от ненулевых?
Для расчетов динамических процессов - это важно (начальные условия).
Во всех остальных случаях- нет никакой разницы между нулем и не нулем.
-
> aka © (01.02.17 15:14) [18]
>
> Тестировал только что еще раз:
>
> D7 : 1
> Свой ЯП : 150
> PHP(c командной строки) : 300
> То есть, это очень сильно обрезанный интерпретатор. А раз
> он очень сильно обрезанный, значит, и практической ценности
> тоже не имеет. Соответственно, и на диплом тоже не потянет.
>
>
> Остается курсовик.
Иду 7-ми мильными, добавил действия с плавающей точкой. Но теперь:
D7 : 1
Свой ЯП : 180
PHP(c командной строки) : 300
-
> добавил действия с плавающей точкой
Надеюсь, Вы сначала добавили их в формальную спецификацию языка, и только после этого - в интерпретатор?
-
> сначала добавили их в формальную спецификацию языка, и только
> после этого - в интерпретатор?
>
и обернуть в транзакцию непременно
-
> Надеюсь, Вы сначала добавили их в формальную спецификацию
> языка, и только после этого - в интерпретатор?
спецификация потом :)
Сейчас разработка на стадии унарного минуса, есть вариант сделать как во всех языках т.е.
а := -b {что дает минус}
а := --b {что дает плюс}
а := ---b {что дает минус}
а := ----b {что дает плюс}
или запретить более одного унарного минуса, но будет ли это правильно - вопрос.
С одной стороны - это возможность всех языков, а с другой - не нужный избыточный огород. Как думаете?
-
Так а зачем вводить сугубо искусственные ограничения?
Выражение может начинаться с унарного минуса.
Унарный минус ставится перед выражением.
Какой вывод?
-
> Kerk © (09.02.17 23:15) [56]
>
> Так а зачем вводить сугубо искусственные ограничения?
>
> Выражение может начинаться с унарного минуса.
> Унарный минус ставится перед выражением.
>
> Какой вывод?
Ну так даже проще в реализации. Но это с родни бессмысленности лишних символов, сюда же можно отнести пустые выражение (когда можем наставить сколь угодно ;;;;;;;). А зачем?
-
> спецификация потом
Огромное заблуждение. Писать интерпретатор, не имея формального описания языка - это называется "делаю то, сам не знаю что". Сразу можно сказать, что в таком интерпретаторе будет куча глюков Не Вы первый делаете эту ошибку и результат всегда один и тот же.
Кстати, именно потому, что формального описания еще нет у Вас и возникли затруднения с унарными операциями.
-
> Кстати, именно потому, что формального описания еще нет
> у Вас и возникли затруднения с унарными операциями.
да нет затруднений, есть просто вопрос [55].
> Огромное заблуждение. Писать интерпретатор, не имея формального
> описания языка - это называется "делаю то, сам не знаю что"
А на счет этого даже спорить не буду. Но все дело в том, что занимаюсь я этим сугубо в свое удовольствие. И неделю назад не было не циклов не if else. Просто летел вперед, писал код под воздействием большого интереса - как это все можно реализовать программно.
-
> aka © (09.02.17 23:51) [59]
На соревнованиях по спортивному ориентированию один спортсмен бежал намного быстрее другого спортсмена, но все равно ему проиграл. На недоуменный вопрос "как же могло так получиться?" второй спортсмен ответил: "Ты нарушил главное правило - не беги быстрее, чем думает твоя голова".
А гонщики говорят так: "Нельзя ехать быстрее, чем тебе позволяют твои тормоза".
Понимаете, о чем я?
:o)
-
> Понимаете, о чем я?
> :o)
Конечно понимаю, но такая тактика тоже оправдана и так я делал не раз. Сначала забегал вперед в "неизвестность" осмысляя основные моменты, а вторым заходом переписывал все на чистовик.
Но что конкретно люди думают по поводу [55],[57], так пока и не услышал
-
> Ну так даже проще в реализации. Но это с родни бессмысленности
> лишних символов, сюда же можно отнести пустые выражение
> (когда можем наставить сколь угодно ;;;;;;;). А зачем?
Глупости говорите. Вам для разбора выражений нужен автомат с магазинной памятью. А там один минус или десять нет никакой разницы.
Я понимаю если бы вы спросили про символы с правой рекурсий их действительно проще ограничить одним уровнем.
-
> aka © (10.02.17 09:10) [61]
> Но что конкретно люди думают по поводу [55],[57], так пока
> и не услышал
А между ответ уже был в [56].
Нет никакой разницы, сколько и каких унарных операций идут подряд. И если бы Вы имели формальную спецификацию языка, то из нее это было бы сразу видно, поэтому вопрос [55] даже и не возник бы (о чем и было сказано в [58]).
-
* А между тем ...
-
>Юрий Зотов © (10.02.17 00:06) [60]
А имеется в природе литература, в которой подробно описан процесс создания именно интерпретаторов? Только полноценных, а не "2+2 работает, а дальше по аналогии". Так чтобы с пользовательскими функциями и т.д. От самого начала и до полного завершения, а не до уровня окончания синтаксического разбора. Вот по компиляторам есть несколько, а по интерпретаторам не встречал.
-
> Сергей Суровцев © (10.02.17 10:03) [65]
Я тоже не встречал.
-
Сергей Суровцев © (10.02.17 10:03) [65]
Начать с того, что по своей сути интерпретатор от компилятор несильно отличается.
У Шилдта был пример разработки интерпретатора Basic.
Герберт Шилдт, Язык программирования С, какое-то очень древнее издание.
-
> Сергей Суровцев © (10.02.17 10:03) [65]
> Вот по компиляторам есть несколько, а по интерпретаторам
> не встречал.
Сильно не интересовался, меня больше компиляторы интересовали.
Не совсем. Есть книга "Практическое программирование на Tcl и Tk" в нём описывается устройство интерпретатора с использованием пользовательских функций и процесс их внесения в интерпретатор. Грамматический анализатор там тоже описан, благодаря простой грамматики он там занимает менее 1000 строк.
Но я вам советую обратить внимание на цикл статей "@tyomitch"
https://habrahabr.ru/users/tyomitch/topics/page5/
-
>aka © (09.02.17 23:11) [55]
По итогу унарный минус должен быть один. Перед выражением.
Игры с "-- = +" до добра не доведут.
Здесь есть момент восприятия:
--х что это
1) префиксный декремент
2) сложение унарных минусов в плюс
3) ошибка ввода
А варианты интерпретации:
---х даже представить страшно
Все операции с изменение знака через умножение на "-1".
А вещи типа: ";;;;" просто проглатывать как пустые строки.
Только помните, что когда выдаете сообщения об ошибке в такой-то строке, пустые строки с переводом строки тоже надо считать.
-
> [69] Сергей Суровцев © (10.02.17 10:26)
> --х что это
> 1) префиксный декремент
> 2) сложение унарных минусов в плюс
> 3) ошибка ввода
Именно 1, если приоритет у него выше, а ниже делать его не надо, чтобы не было ещё много неясностей помимо 2 и 3..
-
> [69] Сергей Суровцев © (10.02.17 10:26)
> А вещи типа: ";;;;" просто проглатывать как пустые строки
Типа отдельно их что ли обрабатывать? Нафига?
Ну и с унарный минус имножением заменять неразумно, к тому же унарный минус у -1*x придётся тоже отдельно обрабатывать? Или в числах не считается - числа исключение?:)
-
>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 10:16) [67]
>Pavia © (10.02.17 10:18) [68]
Спасибо за информацию.
>Игорь Шевченко © (10.02.17 10:16) [67]
>Начать с того, что по своей сути интерпретатор от компилятор несильно отличается.
В общем и целом да, до какого-то момента и вообще не отличаются. Но дальше "дьявол в деталях".
-
>Inovet © (10.02.17 10:54) [70]
x = 5;
---x:
--(-x) = -6
-(--x) = -4
----x = ?
---------------------x = ????????????
Конечно, все это можно обрабатывать. Академически. Но нафига? Для нормального языка возможность такой конструкции без ошибки - зло.
-
> [74] Сергей Суровцев © (10.02.17 11:40)
> Для нормального языка возможность такой конструкции без
> ошибки - зло.
Первое не зло, но не надо так делать, 2 и 3 и так ошибки - куда присвоение происходит?
Ну и отдельно
--(-x)
----x
---------------------x
Хоть и не ошибка, но тоже не надо так делать.
-
>Inovet © (10.02.17 12:00) [75]
>2 и 3 и так ошибки - куда присвоение происходит?
Это же не готовый код, а пример вариантов восприятия.
>Хоть и не ошибка, но тоже не надо так делать
А вот это уже не разговор.
"Мы написали язык, в котором вы можете использовать такую вот косячную конструкцию, но убедительно вас просим - не надо так делать"
В языке все должно быть предельно понятно и лаконично. Любая конструкция нужна для определенной цели, прозрачна, однозначна в восприятии и исполнении. Если заранее известно что "не надо так делать", значит не надо давать возможности "так делать".
-
> В языке все должно быть предельно понятно и лаконично. Любая
> конструкция нужна для определенной цели, прозрачна, однозначна
> в восприятии и исполнении. Если заранее известно что "не
> надо так делать", значит не надо давать возможности "так
> делать".
В чем и вся суть вопроса [55]
> Pavia © (10.02.17 09:35) [62]
> Глупости говорите. Вам для разбора выражений нужен автомат
> с магазинной памятью. А там один минус или десять нет никакой
> разницы.
Зачем эти отступления? Все это понятно. Но был конкретный вопрос - разрешать или нет городить ненужный огород из минусов. Разницы автомату нет, но можно ограничится одним, более одного = ошибка.
-
>--(-x) = -6
>-(--x) = -4
1 минус достаточно (имхо). Неужели есть практика необходимости в большом кол-ве минусов? Ведь всего 2 варианта или минус или нет.
-
>aka © (10.02.17 13:10) [77]
Дело не в минусах. А в операциях. --х судя по Сишному синтаксису интерпретатора тоже предполагается. Как и ++х. Дело в том, чтобы не разрешать 2 и более подряд унарных операций. Кому сильно надо, есть скобки.
-
Сергей Суровцев © (10.02.17 11:27) [73]
> В общем и целом да, до какого-то момента и вообще не отличаются.
> Но дальше "дьявол в деталях".
Да какой там дьявол. Получив синтаксическое дерево, ты не генерацией кода занимаешься, а выполнением операций языка.
-
>Игорь Шевченко © (10.02.17 13:51) [80]
>ты не генерацией кода занимаешься, а выполнением операций языка.
Вот именно. "Занимаешься", "ты", пошагово, построчно, сам, лично, ручками. По каждой операции. И вопросы хранения, доступа, обработки переменных, массивов, совместимости типов, вызова функций, проверка параметров, анализ и сообщения об ошибках и т.д. это только твое личное дело. И все это хозяйство не в виде скомпилированного кода, а в виде исходного. И надо чтобы по времени все это обрабатывалось приемлемо шустро. Тут и возникают вопросы оптимальной реализации.
-
> И все это хозяйство не в виде скомпилированного кода, а
> в виде исходного.
Все это хозяйство в виде синтаксического дерева.
> И вопросы хранения, доступа, обработки переменных, массивов,
> совместимости типов, вызова функций, проверка параметров,
> анализ и сообщения об ошибках и т.д. это только твое личное
> дело
Часть этих проблем решается на уровне анализа, часть на уровне исполняющей среды.
Открой для себя Yacc.
-
>Юрий Зотов © (10.02.17 10:10) [66]
>Я тоже не встречал.
Вот это и странно. Большинство современных и популярных языков либо интерпретаторы, либо изначально были таковыми. А хорошей полноценной литературы, посвященной именно этой теме нет. Парадокс.
-
> Сергей Суровцев © (10.02.17 13:30) [79]
> >aka © (10.02.17 13:10) [77]Дело не в минусах. А в операциях.
> --х судя по Сишному синтаксису интерпретатора тоже предполагается.
> Как и ++х. Дело в том, чтобы не разрешать 2 и более подряд
> унарных операций. Кому сильно надо, есть скобки.
В Си++ знаки идущие рядом преобразуются в теги ещё на стадии препроцессинга.
-----ap преобразуется в набор тегов '--' '--' '-' 'ap'
А вот дальше грамматический анализ проверяет унарность операций. И в данном примере унарный минус тут только один. Но даже если каким-то чудом или за счёт использования пробела их было два. То компилятор бы начал ругаться.
По поводу запретить две и более унарных знака поддерживаю. Хотя насколько знаю в Си это сделано из-за указателей (унарный оператор '*').
'**' - это отдельный оператор.
-
> aka © (09.02.17 23:31) [57]
>
> Ну так даже проще в реализации. Но это с родни бессмысленности
> лишних символов, сюда же можно отнести пустые выражение
> (когда можем наставить сколь угодно ;;;;;;;). А зачем?
С одной стороны да. Но с другой никогда не знаешь каким боком тебе такие упрощения вылезут.
Например, в Делфи в отличие от С не обязательно писать скобки при вызове функций. В C надо писать
somefunc()
;, а в Делфи хватит и просто
somefunc;
. В большинстве случаев. Но в редких случаях в делфи эти скобки писать обязательно. И это вот неединообразие ведет к неочевидным на первый взгляд багам.
Синтаксис должен быть простым, предсказуемым и единообразным. Действие операторов не должно зависеть от контекста.
-
>Игорь Шевченко © (10.02.17 14:34) [82]
>Часть этих проблем решается на уровне анализа, часть на уровне исполняющей среды.
Игорь, прости, какой "исполняющей среды"?
-
> Сергей Суровцев © (10.02.17 14:18) [81]
> Тут и возникают вопросы оптимальной реализации.
Наверно такой литературы нет, так как проблема решается сведением до компилятора байт-кода?
А во вторых многие заваливаются на парсере так как очень большая часть.
> И вопросы хранения, доступа, обработки переменных,
Это решается семантическим деревом.
> совместимости типов
Решается на этапе преобразование в триграммы вернее в IR (внутренее представление).
> проверка параметров
Статическая типизация?
У меня половина компилятора или чуть больше занимает всё это, а парсер меньше половины.
-
> Это решается семантическим деревом.
Когда строишь это дерево дублирующие данные заменяешь на ссылки.
Обращение по ссылкам уже оптимально O(1). Поэтому при исполнение всё будет быстро.
У тебя есть синтаксическое дерево с тегами к примеру 'MyVar'. Ты не знаешь к кой переменной они относятся так как у разных переменных может быть одно имя.
Надо обойти дерево и заменить теги ссылками на объявления переменных. Которое храниться в этом же дереве.
Запретив вложенные функции такой поиск объявлений сводиться к просмотру 4-х списков. Поиск в которых можно свести к O(1) при желании (Хэш таблицы).
А если не заморачиваться, то обход дерева с возвратом. Возврат нужен для поиска первого объявления так как бывают перекрывающиеся имена.
Так как я не запрещал вложенные пришлось много кода править. Но не так много как кодогенирация.
-
Сергей Суровцев © (10.02.17 15:12) [86]
> Игорь, прости, какой "исполняющей среды"?
Обычно выход интерпретатора - это набор инструкций для некоторой виртуальной исполняющей среды, которую тем или иным образом эмулируют на конкретном процессоре. Как Java, например.
-
> [76] Сергей Суровцев © (10.02.17 12:31)
> Если заранее известно что "не надо так делать", значит не
> надо давать возможности "так делать".
Значит ограничить в чём-то язык. Оно, может, и неплохо. НО, надо это определить в спецификации и без противоречий. А в парсере уже проблем не составит отловить унарный минус и декремент.
-
> [81] Сергей Суровцев © (10.02.17 14:18)
> И все это хозяйство не в виде скомпилированного кода, а
> в виде исходного.
Вообще-то "скомпилированного" в дерево.
-
> [83] Сергей Суровцев © (10.02.17 14:39)
> >Юрий Зотов © (10.02.17 10:10) [66]
> >Я тоже не встречал.
>
> Вот это и странно. Большинство современных и популярных
> языков либо интерпретаторы, либо изначально были таковыми.
Я где-то видел интерпретатор Си. Не у того ли автора, что ИШ привёл?
-
> [84] Pavia © (10.02.17 14:42)
> В Си++ знаки идущие рядом преобразуются в теги ещё на стадии
> препроцессинга.
> -----ap преобразуется в набор тегов '--' '--' '-' 'ap'
Круто.
-
> [84] Pavia © (10.02.17 14:42)
> в Си это сделано из-за указателей
Вот! Я ждал указателей. Но мы пока про них не говорили, а то и примеры там выше с -(--x) и т.п. вполне рабочие могут оказаться - зависит от типа x.
-
>Игорь Шевченко © (10.02.17 15:49) [89]
>Обычно выход интерпретатора - это набор инструкций для некоторой виртуальной исполняющей среды, которую тем или иным образом эмулируют на конкретном процессоре
Интерпретатор это и есть та самая виртуальная исполняющая среда. На входе там текст исходного кода. На выходе результат его исполнения. В середине либо построчная обработка, либо байт-код, либо JIT-компиляция. Вот в этой середине самое интересное и есть.
-
> [84] Pavia © (10.02.17 14:42)
> '**' - это отдельный оператор.
Нет - это две операции.
-
> [95] Сергей Суровцев © (10.02.17 16:21)
> В середине либо построчная обработка
Язык Fort в этом смысле всех уел - и построчная и компиляция.:)
-
Сергей Суровцев © (10.02.17 16:21) [95]
Я бы рекомендовал литературу почитать и поизучать примеры готовых продуктов, благо, навалом.
-
> [96] Inovet © (10.02.17 16:33)
> > [84] Pavia © (10.02.17 14:42)
> > '**' - это отдельный оператор.
>
> Нет - это две операции.
А в Фотртане, да.
-
> Вот это и странно. Большинство современных и популярных
> языков либо интерпретаторы, либо изначально были таковыми.
> А хорошей полноценной литературы, посвященной именно этой
> теме нет. Парадокс.
Не переживайте, я как только закончу, все подробно опишу :) Подождите где-то год.
-
> [100] aka © (10.02.17 20:31)
> Подождите где-то год.
Сам сказал. Время пошло, и "где-то" не считаются.:) Не напрягайся - если тебе это в кайф, так не устанавливай сроки, если работа, так тем более не стал бы здесь говорить.
-
> Игорь Шевченко © (10.02.17 14:34) [82]
>
>
> > И все это хозяйство не в виде скомпилированного кода,
> а
> > в виде исходного.
>
>
> Все это хозяйство в виде синтаксического дерева.
Может быть трехадресный код.
-
Чисто случайно строки "интересные" получились. На этапе недописанного присвоения одтельного символа.
module m1;
#console;
var
char str[];
main
str[] = "hello";
str[1] = "ivan";
println(str[]);
end;
вывод: hivan
Наверное пока так и оставлю :) а потом видно будет.
-
> Может быть трехадресный код.
Мне начинать бояться сразу или можно погодя ?
-
> Мне начинать бояться сразу или можно погодя ?
Как хотите. Не я же это придумал.
-
> Игорь Шевченко © (17.02.17 14:50) [104]
>
>
> > Может быть трехадресный код.
>
>
> Мне начинать бояться сразу или можно погодя ?
Вы что литературу шерстите? :)