Обновил сырцы ROBBYC в репе поправив багу, которая проявлялась на 16-битных системах с командой PUSH - неправильно компилировалось например сравниение if(sum==#FFFF):
https://gitlab.com/nedopc/sdk/-/tree/master/robbyc
Бага с CONTINUE, а также невозможность использования двоеточия : внутри SAY пока остаются "известными" багами...
Robby - расширение языка Robot Warfare 1 (RW1)
Moderator: Shaos
Re: Robby - расширение языка Robot Warfare 1 (RW1)
Я тут за главного - если что шлите мыло на me собака shaos точка net
Re: Re:
$ уйдёт под строки, а байтовые переменные можно помечать суффиксом ` (prime - значок на клавише левее 1). В будущем переменные имеющие тип плавающая точка можно помечать суффиксом ~ (расположено на той же клавише левее 1). Далее суффикс ! может обозначать обращение к половинкам слова - VAR!L к младщей и VAR!H к старшей - причём такая запись будет допустима как справа, так и слева от присваивания (придётся добавить новые команды в длинные выражения - LOADL, SAVEL, LOADH и SAVEH работающие со старшими половинками переменных, а также надо будет как-то помечать выражения, внутри которых операторы работают с байтами, а не со словами - либо другим кодом, отличным от 0x40, либо специальной командой-префиксом). Препроцессор будет подменять обращения к однобайтным переменным на обращения к половинкам неявных 16-битных переменных, добавленных препроцессором - например VAR1' будет заменено на _1!L, а VAR2' на _1!H (или лучше ! и !! сделать?)...Shaos wrote:Еще можно сделать переменные типа беззнаковый байт, добавляя к имени суффикс $ - внутри такие однобайтовые переменные будут представлены как половинки обычных переменных, соответственно надо будет добавить 2 постфиксных спецоператора, которые могут выделять младший байт переменной ' и старший байт переменной " - препроцессор будет их вставлять в выражения вместо вызова соответствующих байтовых переменных
P.S. Можно многобайтовые целые поддержать задавая их размер в байтах после ' типа VAR'4 и VAR'8, тогда обращение к их отдельным байтам можно организовать через VAR!0, VAR!1 и т.д. (а надо ли?). Препроцессор будет заводить нужное количество массивов для представления таких чисел, а наряду с командой длинного выражения 0x40 можно добавить 0x4B для байтовых выражений, 0x4F для выражений с плавающей точкой, а также 0x50+N (где N>=3) для выражений работающих с многобайтовыми данными (ограничиться сверху скажем 12-байтовыми числами)...
P.P.S. Но серьёзные расширения байткода будут не раньше версии 3...
Я тут за главного - если что шлите мыло на me собака shaos точка net
Re: Robby - расширение языка Robot Warfare 1 (RW1)
Ещё наверное имело бы смысл добавить джавовский беззнаковый сдвиг >>> при котором число слева всегда нулями дополняется (в джаве нету беззнаковых типов, как собственно и в Robby, поэтому беззнаковый сдвиг нужен как отдельная операция). Также можно добавить оператор возведения в степень ** как в языках Algol, Basic, Fortran, JavaScript, OCaml, Pascal, Perl, Python, Ruby и Smalltalk...
Я тут за главного - если что шлите мыло на me собака shaos точка net
Re: Robby - расширение языка RW1
Тут по ходу можно поддержать обход строки через for C in string$ где строка обходилась бы не пословно, а побайтно, т.е. препроцессор будет это превращать примерно вот в это:Shaos wrote:Цикл for(A in 1..10) превращается в тоже самое как и for(A=1;A<=10;A++) - это просто, а вот с for(A in array) надо помудрить ибо A в данном случае не индекс, а значение соответствующего элемента из массива, т.е. придётся для хранения индекса заводить "скрытую" переменную _1 (и далее _2, _3 и т.д.), которая будет инкрементироваться для доступа ко всем элементам массива array и A в цикле "под водой" будет присваиваться значение array[_1]. Обязательность скобок можно отменить - тогда синтаксис циклов будет похож на Rust. Аналогичный подход со скрытыми переменными, которые генерит сам компилятор, я планировал использовать для реализации вызовов функций в составе арифметических выражений.Shaos wrote:В первую очередь надо поддержать вышепредложенный вариант DEF STRING$="aaa" (даже без квадратных скобок т.к. необходимый размер массива в словах будет вычисляться компилятором).
Во вторую очередь надо реализовать расширение for: for(A in 1..10) (как в аде или руби) и for(A in array) (как в джаваскрипте), причём на уровне препроцессора!
Также хочу количество регистров увеличить до 26, дабы охватить все буквы алфавита, а вот с локальнымм переменными надо подумать...
Code: Select all
_1=0
do
{
_2 = string$[_1>>1]
if(_1&1) C=_2!!
else C=_2!
...
_1++
} while(C!=0)
Code: Select all
_1=0
do
{
С = string$[_1]
...
_1++
} while(C!=0)
Я тут за главного - если что шлите мыло на me собака shaos точка net
Re: Robby - расширение языка Robot Warfare 1 (RW1)
Выкатил новую версию ROBBYC v2.3.4 в которой чуть более тщательно проверяю имя входного файла робота (раньше оно прям сразу шло в TextLoad), а также добавил новую опцию -n которая запрещает инклуды (нужно для запуска компилятора на сервере с произвольными входными файлами):
https://gitlab.com/nedopc/sdk/-/tree/master/robbyc
Code: Select all
ROBBYC - Robby Preprocessor & Compiler v2.3.4 (Jan 22 2025)
Copyright (c) 1998-2025, Alexander "Shaos" Shabarshin
http://nedoPC.org (E-mail: me@shaos.net)
Usage:
ROBBYC [options] FILE.R
options :
-h : help
-p : create preprocessor file (.R!)
-l : create listing file (.RLS)
-r : create JSON file (.RJS)
-d : append debug info
-n : disable includes
Я тут за главного - если что шлите мыло на me собака shaos точка net
Re: Robby - расширение языка Robot Warfare 1 (RW1)
Надо CI/CD тесты SDK добавить, а то ведь они уже есть, но пока не запускаются автоматически...
Я тут за главного - если что шлите мыло на me собака shaos точка net
Re: Robby - расширение языка Robot Warfare 1 (RW1)
На новом сервере стоит GCC v12.2 и собранный в нём robbyc косячит - вот такой робот с софтверным рандомом (как он был у меня написан ещё в 2002 году):
выдаёт ошибку FULL STACK:
а на домашнем линухе с robbyc собранным в GCC v8.3 этот же робот компилируется без проблем 
Code: Select all
robot "bug-gcc-12.2"
author "Shaos"
main()
{
Rand = 11
}
Random() // A-RANGE => C-RESULT L=C
{
Rand = 0x6255*Rand+0x3619
RandH = Rand&0xFF00
RandL = Rand&0x00FF
C = RandH|((RandH>>8)^RandL)
C = C&0x7FFF
if(A) C=C%A
(C)
}
Code: Select all
BUG.R(13): C = RANDH|((RANDH>>8)^RANDL)
ERROR 33: Bad expression
FULL STACK

Я тут за главного - если что шлите мыло на me собака shaos точка net