С разрешения автора выкладываю наиболее полное на сегодняшний день описание языка URQL (версия для URQ_DOS).
Неактивен
Спасибо Korwin'у и uux'у за предоставленную информацию! (написано интересно - прочитаю)
Добавил на код "нашлепок" - и превратился в сканер синтакиса, режимы работы:
непосредственная работа/проверка синтаксиса/проверка синтаксиса и наличие меток переходов (режимы работы настраиваются двумя булевскими переменными). сейчас включен последний режим, показывает возможности текущей версии по разбору команд. (без сканирования меток работает на порядок быстрее, и еще, текущая версия не знает оператор ELSE) также не позволяет создавать "goto #%стр$" и прочие безобразия в вычислениях, непомню как выглядело, что-то типа: "x+#abc$" - причем подобные записи были не в строках.
___ комментируйте строки ";" если хотите чтобы их пропускал парсер.
p.s.: для переходов на строковую метку пользователя я лучше сделаю внутреннюю переменную и команду, которая считывает оттуда и преобразовывает строку в пользовательское_имя_метки (просто это концепция парсера - отделить строки от пользовательских имен)
___
если выявилась ошибка, то ее нужно искать назад по строке от обозначенного места, т.к. сканер говорит о ней, когда становится однозначно ясно.
иногда ошибку нужно смотреть на предыдущей строке, во время сканирования текста не выводится ни каких сообщений, текст необходимо переконвертировать а dos-кодировку (можно сделать стандартным виндовым WordPad, предварительно сменив расширение файла на ".txt")
___
ни один из нескольких сканированных не был полностью правильным, то метки не хватало, то команды пропущены...
Отредактировано abcdef (21.07.2009 09:40)
Неактивен
uux написал:
Поклонники URQ-среды в (условно) массовых количествах живут здесь: http://urq.borda.ru. А на сайте http://urq.plut.info/soft есть возможность посмотреть (почти все) последние достижения urq-интерпретаторостроения).
вроде бы ясно написано
ни один из нескольких сканированных не был полностью правильным, то метки не хватало, то команды пропущены...
чего сканируем? непонятно
Неактивен
Представляю тестовую версию программы URQ-интерпретатора с исходным кодом на языке Pascal.
Оформление отображения текста пока не проводилось, основная задача - проектирование парсера для стандартизации и единообразия представления алгоритма разбор команд языка URQL.
Практически все, если не все, программы URQL построены по принципу вычленения подстрок, когда считанная строка делится по позиции вхождения какого-либо слова, а эти половинки обрабатываются по отдельности...
Здесь-же предлагаю алгоритм, работающий по принципиально-другому способу - разбору как у стандартных языков программирования.
что реализовано в данной (0.0.1) версии:
поддержка всех арифметических и логических операций, операторы:
if ... then ... [else не поддерживается]
p, pln, btn - строки текста с подстановками #выражение$ #%текстовая_переменная$ ##выражение$
instr - единственный способ создания текстовых переменных (длины хранимой строки пока ограничена 63 символами) с подстановками #выражение$ #%текстовая_переменная$ ##выражение$
goto, proc, common, inv, rnd, cls, input, invkill, perkill, save, pause, end.
Характеристики:
* работа с файлами неограниченной длины
* при переходе по метке файл перечитывается заново
* таблица переменных (переменные/инвентарь/метоки/строки) длиной 750 элементов. (строковые типы занимают по два элемента).
* история возврата из подпрограмм на 1025 позиций.
* анализатор ошибки отображает: необходимый оператор для данной конструкции, указание строки, позиции в строке где обнаружена.
* запуск с командной строки (help - выводится при запуске без параметров)
* пока интерпретатором обрабатываются файлы только в dos-кодировке (ASCII).
Режимы работы:
0 - запуск квеста
1 - запуск из сохранения (не тестировался)
2 - сканирование квеста на наличие ошибок
3 - сканирование квеста на наличие ошибок и проверка наличия всех переходов по меткам (долго обрабатывает...)
Отредактировано abcdef (21.07.2009 09:41)
Неактивен
прочитал документацию Korwin'а - для полноценной версии нужно:
* добавить операции сравнения строковых переменных и др. (надо подумать как лучше сделать это).
* автоподстановку имени меток, переменных/инвентаря (лучший вариант сделать спец. переменную которая принимает строку, а обращение к ней возвращает одно_имя или один_оператор языка URQL).
* простой способ внедрения оператора ELSE в том, чтобы разместить его после IF... THEN на следующей строке,
например:
if i<max then pln Обработка...
else pln Конец обработки...
____
в примерах показано так:
if Дубина then btn шмяк,Ударить зеленого гоблина дубиной по башке! else btn драп,Драпать!
так что получается что кроме символов: # & <crlf> в строках нельзя использовать слово <ELSE>?
интересны также часто встречающиеся конструкции вида: if i<max then goto loop1 else pln Конец цикла
в которых можно вообще обойтись без ELSE, т.е. примерно так:
if i<max then goto loop1
pln Конец цикла
_____
осталось несколько вопросов:
в доке: - Выражение #переменная_x$ заменяется на значение числовой переменной 'переменная_x'
вопрос: - понятно если это встраивается в строку, но если это просто оператор по тексту программы, кто мешает просто писать ...переменная_x... без #...$?
__
в доке: - Возможно вложение, то есть такая строка считается допустимой: #var#x$$
вопрос: - а нужно ли вложение? т.к. это аналогично операции вида: #var$#x$
_Заранее спасибо!
_____
p.s.: у кого какие предложения/пожелания для усовершенствования предложенного AURQ?
Неактивен
abcdef написал:
прочитал документацию Korwin'а - для полноценной версии нужно...
Не совсем понятно, полноценная версия чего имеется в виду - языка urql или интерпретатора aurq.
abcdef написал:
в примерах показано так:
if Дубина then btn шмяк,Ударить зеленого гоблина дубиной по башке! else btn драп,Драпать!
так что получается что кроме символов: # & <crlf> в строках нельзя использовать слово <ELSE>?
Else можно использовать в строках (точнее, в операторах вывода) - например, pln else
- вполне допустимый оператор. Проблема возникает только при выводе символа комментария - pln Ничего не вышло; наверное, надо попробовать что-то еще.
выведет
Ничего не вышло
Это обходится путем использования подстановки: pln Ничего не вышло##59$ наверное, надо попробовать что-то еще.
(В доке это, кстати, не описано).
Впрочем, если заниматься выводом на экран else в пределах оператора if, такая проблема действительно может возникнуть. Обходится аналогичным образом.
Вообще, самый простой путь проверить, что можно в языке делать, а что нет (по крайней мере, в таких сравнительно простых случаях) - это самому составлять коротенькие тестовые примеры и прогонять их на URQ_DOS.
abcdef написал:
интересны также часто встречающиеся конструкции вида: if i<max then goto loop1 else pln Конец цикла
в которых можно вообще обойтись без ELSE, т.е. примерно так:
if i<max then goto loop1
pln Конец цикла
Ну, просто каждый пишет код так, как ему удобнее;).
abcdef написал:
осталось несколько вопросов:
в доке: - Выражение #переменная_x$ заменяется на значение числовой переменной 'переменная_x'
вопрос: - понятно если это встраивается в строку, но если это просто оператор по тексту программы, кто мешает просто писать ...переменная_x... без #...$?
__
в доке: - Возможно вложение, то есть такая строка считается допустимой: #var#x$$
вопрос: - а нужно ли вложение? т.к. это аналогично операции вида: #var$#x$
_Заранее спасибо!
Отвечаю на оба вопроса сразу следующим примером:
m1=1 m2=2 m3=3 selector=rnd3 if m#selector$=2 then pln Переменная m#selector$ равна двум! else pln Переменная m#selector$ равна #m#selector$$!
См. также в документации раздел "Массивы".
Предупреждаю - я не urq-гуру и не смогу привести примеры задач, которые в URQ можно решить только таким способом и никак иначе. В то же время много людей пользуются данной возможностью, из чего можно сделать вывод, что она если и не безальтернативная, то как минимум достаточно удобна.
abcdef написал:
p.s.: у кого какие предложения/пожелания для усовершенствования предложенного AURQ?
Ну, я уже говорил об этом раньше (в самом первом своем посте в этой ветке), повторяться не хочется;).
Неактивен
Единые правила работы интерпретатора:
<зарезервированные символы> - : ; > < = + - * ( ) / \ , # $ & #13#10 #27
<зарезервированные слова> - and or not if then else p pln btn goto proc end inv rnd instr cls input pause music play save common anykey invkill perkill system
<пользовательское имя> - имя состоящее из любых символов, кроме служебных; символы с кодом меньше или равном 32 вырезаются (знаки табуляции, пробелы). Также в имя не могут входить <зарезервированные слова>
<строка текста> - символы до знака "&" или конца строки, где обрабатывается вставки после наличие символа "#", причем этот символ требует завершения символом "$":
#$ - подстановка пробела
#/$ - подстановка перехода на новую строку
##<арифметическо-логическое выражение>$ - где <арифметическо-логическое выражение> = подстановка кода печатаемого символа
#<арифметическо-логическое выражение>$ - где <арифметическо-логическое выражение> = подстановка вычисленного числа
#%<пользователское имя>$ - где <пользователское имя> = подстановка строки из строковой переменной <пользовательское имя>
Опрерация подстановки system. Заменяется содержимым строки sys, например (var=_abc1):
instr sys=lab#%var$
goto system
представляется в:
goto lab_abc1
Оператор выбора записыается следующим видом:
if <условие> then <действие>&<действие>&...
else <действие>&<действие>&...
Количество пореходов на метку можно получить только так: count_<пользовательское имя>
Инвентарь по кнопке "i" - в меню текущей локации добавляются действия с инвентарем. При выборе действия с инвентарем они ставяться в очередь и выполняются при переходе в следующую локацию.
____
p.s.: исправил некоторые ошибки в текущей версии, в ближайщем будущем добавлю сравнение строк по маске и т.д.
о некоторых возможностях интерпретатора сознательно буду умалчивать, чтобы не прививать плохих привычек программирования
Отредактировано abcdef (21.07.2009 09:42)
Неактивен
А чем мотивировалась разработка под DOS?
Вряд ли в наш век найдется хотя бы один пользователь сидящий под чистым досом
Неактивен
прошу прощения, черт дернул компилить перед копированием на сайт с опцией с тотальной проверкой выполнения программы - в итоге вылетало при переполнении переменной счетчика...
___
Добавил поддержку как Dos так и Windows кодировок, теперь запуск производиться из командной строки так:
AURQ <тип_запуска> <тип_кодовой_страницы> <имя_файла_квеста>
тип_запуска:
0 - запуск квеста
1 - запуск из сохранения (файл SAVE.TXT)
2 - сканирование квеста на наличие ошибок
3 - сканирование квеста на наличие ошибок и проверка наличия всех переходов по меткам (долго обрабатывает...)
тип_кодовой_страницы:
w или d
имя_файла_квеста:
как и все Dos-имена - не более 8 символов в названии, и без пробелов
Например: aurq 0 w first.qst
Например: aurq 1 d first.qst
_______
Несколько слов о квесте RIGA.QST - интерпретатор пока требует чтоб в каждом квесте была локация common, хоть и пустая, например:
:common
end
Примечание для ускорения работы, желательно часто вызываемые локации, например common размещать как можно ближе к началу файла.
В строках текста два служебных символа: это "&" и "#" первый - признак завершения строки, второй - признак начала подстановки и должен заканчиваться символом "$". Эти два символа можно заменить кодами #38$ и #35$
_______
По Dos делаю потому что несколько ограниченная среда и меньше соблазнов к неоптимальному стилю программирования, что вцелом благоприятно влияет на разработку. Потом можно будет немножко подкорректировать (2-3 часа) и будет готова мобильная версия на MidletPascal.
Отредактировано abcdef (21.07.2009 09:44)
Неактивен
исправлено:
- команда anykey
- зарержка команды pause
- уменьшено мерцание курсора
- генерация ошибки, если невозможно перейти на метку (ранее просто зависал)
- сообщение о завершении квеста, в локации которой нет кнопок
Отредактировано abcdef (21.07.2009 09:45)
Неактивен
1 написал игру Aurq-tetris (в архиве с программой)
2 исправил пару ошибок
3 добавил более корректную обработку переполнение экрана
4 подкорректировал алгоритм задержки
5 добавил работу с цветом, за это отвечают три переменных:
style_textcolor
style_buttoncolor
style_cursorcolor
они определяют цвет текста и заднего фона и находятся в диапазоне 0...255, где
младшие 4 бита цвет текста, старшие 4 бита - цвет фона,
например: фон=2; текст=14 будет так: style_textcolor=2*16+14
Отредактировано abcdef (21.07.2009 09:46)
Неактивен
добавлена поддержка шифрованных квестов формата QS1 (также сделал конвертер отдельной программкой для удобства отладки)
доработал разбор, теперь строки с названиями меток могут содержать комментарии.
при сканировании на синтаксис добавлены два вида предупреждений:
"TOO LARGE BLOCK" - текст локации может не поместиться в один экран
"TOO LARGE TEXT" - текстовая строка содержит более 253 символов
обнаружена ошибка проверки (при выполнении все нормально) - не обрабатываются выражения со стоящим вначале знаком минус или плюс "-" "+", например: a=-2 необходимо написать a=0-2
___
Некоторые замечания по нахождению мест распознанных сканированием:
1. Метки btn сканируются в конце локации, поэтому если будет сообщение вида: "Error: label <30> not found (STR:775,POS:0,TOKEN:end)" где "TOKEN:end" то это говорит что мы в конце локации, а команда с ошибочной меткой "30" находится где-то выше по тексту.
2. "warning: STR 22, TOO LARGE TEXT" - вполне вожможно что это была предыдущая строка, потому как строка заканчивается переходом на новую строку, а после этого определяется что она слишком длинная.
___
Замечания при генерации переходов: если программа сканирования выдает ошибку на переходе типа goto system, то это значит что в текущий момент сканирования в system находиться мусор чтоб обойти это на этапе отладки можно сделать так:
:1
;предыдущая локация
end
instr sys=2 ;этот код ни когда не будет выполняться в реально работающей программе, сюда поместим заполнение system какой-нить меткой
:2
btn system,назад
end
___
проверен разбор нескольких квестов с http://ripsoft.narod.ru/Download.htm
Гарри Гаррисон
Похождения отважного хомяка Семена: Побег
Похождения отважного хомяка Семена-2: КРУТОЙ СПУСК
Древний кинжал 1
НАДЕЖДА НА ЖИЗНЬ
Без права на надежду
Замечания по поводу сканированных квестов:
1. В квесте Гарри Гаррисон автор перевода на URQ намеренно испортил код квеста повсюду на метках отсутствуют либо ":" вначале метки, либо цифра три исправлена на русскую букву "з".
2. Без права на надежду - много ошибок, такое впечатление будто автор также хотел запутать игрока, порой создается впечатление "как это может вообще работать..."
___
Для пользователей: включены все проверки. версия - отладочная.
Отредактировано abcdef (21.07.2009 09:57)
Неактивен
Нужны, и очень, но не клоны, и чтоб возможностей было больше, а глюков меньше.
Неактивен
Добавлены функции работы со строками:
;получить длина строки/// число = strlen строка&
;сравнить две строки/// число = strcmp строка&строка&
;получить код символа из строки/// число = strchar числовая_позиция,строка&
;скопировать подстроку/// строка = strcopy начальная_позиция, длина_подстроки,строка&
;получить позицию вхождения подстроки в строку///число = strpos подстрока&строка&
;установить символ в строку/// строка = strset позиция, код_символа,строка&
Примечание:
из версии aurq005 ошибок не выявлено, код немного переработан
версия тестовая. просьба сообщать о найденных багах
для работы используйте только последнюю версию программы, если встретилась ошибка проверьте ее на предыдущей версии.
Отредактировано abcdef (21.07.2009 09:47)
Неактивен
собрал windows-версию aurq007.
__
добавлена поддержка музыки, снято ограничение на длину строковых переменных, таблица переменных увеличина в 20 раз т.е. 750*20.
__
внесена ошибка в версию aurq006: нельзя использовать числа в именах переменных, исправлено в текущей версии.
__
подготовил простой тестовый набор для URQL (без использования #...$ в произвольном месте) смотрите как работает в других URQ.:
pln COMPLEX URQ - TEST by arT (c) pln&pln -----------&pln 1. PRINT demo&pause 1 pln !" $% '()*+,-./0123456789:;<=>?@ pln ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_` pln abcdefghijklmnopqrstuvwxyz{|}~Ђ pln Ѓ‚ѓ„…†‡€‰Љ‹ЊЌЋЏђ‘’“”•–—™љ›њќћџ pln ЎўЈ¤Ґ¦§Ё©Є«¬®Ї°±Ііґµ¶·ё№є»јЅѕїА pln БВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯа pln бвгдежзийклмнопрстуфхцчшщъыьэЃљ pln&pln -----------&pln 2. PRINT (char/var/str) demo&pause 1 n=70 instr s=!" $% '()*+,-./0123456789:;<=>?@ p ##48$ , #n$ , #%s$ pln #/$#$#$#n-10$ pln&pln -----------&pln 3. PRINT (char-generator) demo&pause 1 n=0 :l 1 ;) hi all! p ##n$&n=n+1&if n<255 then goto l 1 pln&pln -----------&pln 4. VARIABLE demo&pause 1 normaL VariablE = 5 !"%'.0123456789?@[]^_`{|}~=50 ЂЃ‚ѓ„…†‡€‰Љ‹ЊЌЋЏђ‘’“”•–—™љ›њќћџ ЎўЈ¤Ґ¦=40 §Ё©Є«¬®Ї°±Ііґµ¶·ё№є»јЅѕї=30 pln #normal variable$ , #!"%'.0123456789?@[]^_`{|}~ * 2$ pln&pln -----------&pln 5. EXPRESSION demo&pause 1 n=2+2*2 n2=(2+2)*2 pln 2+2*2=#n$; (2+2)*2=#n2$& ;comment...... bool=n<n2 pln #bool$ = #n<n2$ bool2=30/9>3 and 1 bool3 = not 30/9>3 and 1 p #bool2$ <> #bool3$ if bool2 then pln ok ;) else pln no :( pln&pln -----------&pln 6. PROC demo&pause 1 goto next :proc_label n=n+1 i=i-1 p . if i>0 then proc proc_label end :next n=0 i=10 proc proc_label pln #/$ 10=#n$ ? pln&pln -----------&pln 7. ANYKEY demo&pause 1 pln press a key: anykey key pln = [#key$] key code pln&pln -----------&pln 8. INPUT demo&pause 1 input n&pln your number=#n$ pln&pln -----------&pln 9. MUSIC demo&pause 1 music=1+1 play m1 pln&pln -----------&pln 10. INV demo (press "i")&pause 1 :0 pln label test count_common=#count_common$ inv+ ttt btn 0,0 end :common end :use_ttt_look pln ttt end
Неактивен
AURQ008 (для dos и windows).
1. подкорректирован алгоритм
2. добавлена возможность установки метки в произвольное место, текст метки заканичивается при достижении символов ";" "&" либо конца строки.
кстати напомню что команды "proc" "end" "save" допускается ставить либо единственными на строке, либо в самом конце многокомандной строки.
_______________
привожу пример c произвольным расположением меток
Matrixx-screen:
goto init&:begin&p #/$ #$&i=0&:1&j=0-1&styletextcolor=2&:2&j=j+1&if j>=5 then goto 3 instr sys=x#j$ if (system>=i+1) or (system<i) then goto 2 styletextcolor=10&instr sys=y#j$&system=system+1 if system<=2 then styletextcolor=15 if system>9 then system=1&instr sys=x#j$&system=rnd*10 :3&p #rnd*10$&i=i+1 if i<10 then goto 1 pause 1&goto begin ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; :init&styletextcolor=2*16+10&pln << M A T R I X D E M O by arT (c) e-mail: ironWoodcutter@bk.ru>> styletextcolor=2&i=0&:4&instr sys=y#i$&system=8&instr sys=x#i$&system=1&i=i+1 if i<5 then goto 4 goto begin
Отредактировано abcdef (21.07.2009 10:03)
Неактивен
подробное описание, полные исходники и доработаная версия aurq_win0082
_____
в архиве квест "хроники капитана Блуда, тайна левой ягодицы".
замечания: реализация квеста интересная, но примерно треть локаций не существует, добавляйте сами при прохождении переадревацию в пустую локацию. например:
:give__ :use__ :give_экипаж_блуд :give_gazettedestribunaux_блуд :give_gazettedestribunaux_герда :give_деньги_блуд :give_блокнот_блуд :use_gazettedestribunaux_ :use_gazettedestribunaux_столик :use_деньги_деньги :use_деньги_столик :use_деньги_блокнот :use_блокнот_блокнот :give_столик_блуд :читать_газету :common end
Неактивен
версия aurq0089. описание. белее сотни проверенных и адаптированных квестов в архиве
+Мутанта-3 40000_demo 9_gum A.L about agentD aif Alice's+Adventures+in+Urqland Ancient_dagger_1 Ancient_dagger_2 ARROW Ayk bigsch black_mage BO3POBURN Bodun Brain1 Brain11 buratino CD-пират2-Beginning colors comictravel comictravel2 ConspiracyLifeForNothing Corleone creat Demo DODS DOOMуровень1 DOOMуровень2 ElfQuest ella Escape1_02 EVGENY Evgeny2 fall5 GarpiasFly GEROJ ghost1 grey_mage hacker HackerSim hamster1 hamster2 hippi Hope internet ITF kolobok labirint1 lift-4 Matrix matrix2 mdemo Memory Memory2 mines mystery nash Nightmare p Parish1313 Petrov petrovicch Pikachu poiske Pop qwerty-bench riga Sam Semion StarngerVer11 strtest sword t test tetris TheMagicRill100 the_room TURNIR unreal URQ-2009 VinnyPuh VirusDos VVMB WH Wolf yo Zachetka Вампиры1 Выползание_некроманта Гладиаторы Демоны_темной_стороны Детектив_Memory КвестПроПетю Константин Крюгер Месть Молчание_хрящей Мутация+Мутанта Рагнарек Тень Царство_смерти Черная_пятница Яша
Неактивен
uux - "0 w tetris" значение по умолчанию, если в коммандной строке нет, или не правильно указаны параметры.
запуск производить так:
aurq_win 0 w myquest.qst
aurq_win 1 d myquest.qst
aurq_win 2 w myquest.qst
aurq_win 3 w myquest.qst
aurq_win 4 w myquest.qst
имя квеста без пробелов, а для dos-версии не более 8 символов в имени.
(в предыдущем архиве имеется bat-файл для проверки всех квестов в текущем каталоге с программой aurq_win)
Отредактировано abcdef (02.07.2009 10:56)
Неактивен