Форум » » исходники и новая версия URQ-интерпретатора. Стандарт парсера » Ответить

исходники и новая версия URQ-интерпретатора. Стандарт парсера

abcdef: Представляю тестовую версию программы 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 - сканирование квеста на наличие ошибок и проверка наличия всех переходов по меткам (долго обрабатывает...) не знаю как здесь выложить файл... а так смотрите сюда: http://forum.ifiction.ru/viewtopic.php?pid=14929#p14929

Ответов - 117, стр: 1 2 3 4 5 6 All

abcdef: http://forum.ifiction.ru/viewtopic.php?pid=15057#p15057 1 написал игру Aurq-tetris (в архиве с программой) 2 исправил пару ошибок 3 добавил более корректную обработку переполнение экрана 4 подкорректировал алгоритм задержки 5 добавил работу с цветом, за это отвечают три переменных: style_textcolor style_buttoncolor style_cursorcolor они определяют цвет текста и заднего фона и находятся в диапазоне 0...255, где младшие 4 бита цвет текста, старшие 4 бита - цвет фона, например: фон=2; текст=14 будет так: style_textcolor=2*16+14 p.s.: предлагайте свои тест тестовые примеры

Victor: abcdef пишет: p.s.: предлагайте свои тест тестовые примеры http://ripsoft.narod.ru/Download.htm, раздел "Квесты написанные для этой программы". Там есть 3 ключевых квеста, проходимость которых в интерпретаторе отражает уровень поддержки URQL, перечисляю по возрастанию уровня: 1. Похождения отважного хомяка Семена, часть 1; 2. Древний кинжал 1; 3. Без права на надежду. Пробовал запускать их в версиях 0.0.3 и 0.0.4. 0.0.3: 1. Хомяк 1: если дописать в код пустой common, то практически проходим, если не считать того, что текст основной локации выдается не полностью. Конец вывода: "тренажер (беговое колесо, о котором мечтает каждый заточенный в клетку хомяк). Повсюду вал". Последнее предложение должно быть "Повсюду валяются бумажки (чтобы спать было мягче).", после него должны быть еще 2. 2. Древний кинжал 1: сообщение об ошибке при попытке взять шкатулку, "Error: "=" expected (STR:184,POS:53,TOKEN:,)". Если подправить код локации 16 (в последнем if'е не хватает btn), то ошибка исчезает, но при проверке синтаксиса выдается еще "Error: "," expected (STR:315,POS:24,TOKEN:save)". Полную проходимость квеста после обхода первой ошибки пока не проверил. 3. БПНН: если добавить в код пустой common_777, чтобы обойти первое сообщение об ошибке, появляются ошибки "Error: "," expected", причем первую из них легко убрать, там строчку закомментировать можно, а вот дальше разбираться пока не стал. Скорее всего в AURQ пока недостаточный уровень поддержки #$, хотя проверка синтаксиса ругается на некоторые строки и без #$. 0.0.4: Хомяк 1, ДК 1: баг с цветами. Первая локация и кнопки выводятся, после первого перехода цвет становится черным на черном. БПНН: Runtime error 201 at 0000:2DC3. Еще AURQ у меня часто вызывает Windows-ошибку 16-разрядной подсистемы MS-DOS (линк на скриншот окна ошибки), "Системная ошибка NTVDM Параметр задан неверно.", а также есть какая-то нестабильность в обработке use. Тестовый код: :0 inv+ ttt btn 0,0 end :common end :use_ttt_look pln ttt end правильно сработал почему-то один раз, при последующих вызовах AURQ (без перезагрузки, правда, Windows) программа (версий и 0.0.3 и 0.0.4) виснет при нажатии i и выборе use_ttt_look. Upd 31.03.09: Замечание по поводу use снимается, после перезагрузки Windows зависания исчезли.

Victor: Пожелания автору: * тестировать программу непосредственно перед выкладыванием! Желательно запускать хотя бы десяток выложенных квестов и проверять, что нормально работают хотя бы 5-7 первых локаций. Для начала проверять на квестах с сайта Рипа, кроме квеста "Стань стальной крысой". В целом не допускать ситуаций, когда очередная версия выдает ошибки/виснет/глючит вообще почти на любом коде; * ввести режим игнорирования ошибок. Еще с Рипурки действует правило: интерпретатор должен игнорировать любые операторы и вообще строки, которые он не может распознать. В основном как средство для обеспечения совместимости, в старых квестах правило использовалось даже в том смысле, что в коде можно писать комментарии без ";", специально нарушать синтаксис оператора чтобы его отключить и т.п. Режим поиска ошибок очень полезен, но он должен быть полностью опциональным, не должно быть так, что для обхода "критических" ошибок нужно модифицировать код чуть ли не каждого квеста; * не вводить на ровном месте собственные "костыли" типа system и sys, которые нарушают совместимость сразу со всеми интерпретаторами. Любые добавления в URQL должны быть очень аккуратными, и не зависеть от технических деталей реализации того или иного интерпретатора. Поддерживать обратную совместимость хотя бы с версиями 1.32 и 1.4 URQL в описаниях с сайта Рипа (возможно, за исключением поддержки некоторых экзотических операторов); * делать полную поддержку #$. Конструкция #$ должна обрабатываться почти в любом месте кода, в частности, некоторые операторы должно быть возможно генерировать с помощью #%$. Простейший пример, должно выводиться test: instr a=pln instr b=test #%a$ #%b$ end Пока что в URQL не хватает многих нужных конструкций (циклы, функции, более универсальные операторные скобки...), но именно за счет наличия "дикого" #$ можно делать какие-то аналоги всего этого, которые иногда могут давать даже большие возможности по сравнению с классическими вариантами. Без полного #$ на URQL пока что можно написать максимум не слишком сложную книгу-игру, если только не использовать автоматическую генерацию кода внешними средствами; * серьезное программирование под DOS16, ИМХО, в настоящее время возможно только с прицелом на некоторые КПК, где есть полная поддержка старого ДОСа, а все остальное поддерживается частично или не поддерживается вообще. Если не преследовать такую цель, то лучше сразу переходить куда-нибудь в *32, пока кода еще не так много, и реально будет все вручную проверить при портировании. Ну и плюс, опять же ИМХО, интересно, когда новая урка работает в среде, в которой до этого урки не было, или имеет принципиально новый интерфейс. Интерпретаторы, работающие в Win-консоли и чистом ДОСе в текстовом режиме, уже ведь есть, и это не только Досурка. Upd: URQL в редакциях Рипа лучше рассматривать именно по описаниям, а не по работе соответствующих Рипурок , у них свои странности. Приведенный по поводу #$ код почему-то не работает в Рипурке 1.4, хотя следующий тест генерит нужную кнопку: :0 instr a=btn #%a$ 0,test end И еще забыл ответить на это: Практически все, если не все, программы URQL построены по принципу вычленения подстрок, когда считанная строка делится по позиции вхождения какого-либо слова, а эти половинки обрабатываются по отдельности... Не стоит с такой уверенностью говорить обо всех "программах URQL". В Досурке обработка происходит не так.


abcdef: спасибо Victor! исправляю ошибки "Runtime error 201 at 0000:2DC3" и подобные... сейчас ошибка из-за необходимости ручного приведения типов операндов и др. вычислений (по прежднему оставил опцию компилятора отлавливать эти несоответствия, это не критично для выполнения интерпретатора, но при перенесении на другие языки возможны ошибки). насчет Windows-ошибки 16-разрядной подсистемы MS-DOS - вот это пока загадка... программа не использует лишней памяти или другие системные команды кроме чтения файла, опроса клавиатуры и вывода на экран - все это сделанно стандартными библиотеками языка,.. у меня такого ни когда не было... попробуй протестить на другой машине или windows ---- :0 inv+ ttt btn 0,0 end :common end :use_ttt_look pln ttt end --- запускал код --^ работает стабильно.., дело наверное в том, что я ранее писал: при нажатии кнопки "i" составляется меню use_... , при нажатии на эти элементы их выбор становится неактивным до перехода в другую локацию, при выходе из локации происходит выполнение очереди выбранных use_... (т.е. здесь в текущей локации не будет текста из use_...) Думал чтоб "ввести режим игнорирования ошибок" - но ошибка это неправильная логика, лучше сразу просканировать и разобраться в чем дело, чем неправильно обработанная информация... Буду смотреть квесты, а пока скажу: если текст обрезает, то это из-за того что в pln слишком длинная строка, исправить можно так: p ...это строка меньше или равно 255 символов...&pln ...это остаток строки... ошибки цвета - в программе используются DOS-текстовая палитра 0..255, в других квестах windows 0..65535 или больше цветов, поэтому и несоответствие.. -исправлю в следующей версии в названии переменных не будет символа "_" "сразу переходить куда-нибудь в *32, пока кода еще не так много, и реально будет все вручную проверить при портировании" - проверять в ручную не прийдется, т.к. за интерфейс с пользователем отвечает в основном подпрограмма draw, которая получает все данные из подготовленных массивов, поэтому движек слабо связан с интерфейсом и это большой плюс при переносе на другие платформы. __ и в завершении про system и sys - это просто попытка систематизировать операции подстановки, тем более прогон квеста на ошибки в местах "system" - может выдвать очень интересные сообщения, т.к. логика переходов нарушена при сканировании квеста и там к моменту проверки может находиться что угодно... ___ Спасибо за тестирование! буду смотреть предложенные квесты. р.s.: немножко о сканировнии для тестеров, хотяб на примере buratino.qst: команда proc Save <== в имени метки служебная слово save, заменяем к примеру на save1 (и метку тоже) команда proc rnd() <== в имени метки служебные символы "(" ")" и служебное слово rnd, меняем на rnd1 команда proc rnd <== ... меняем на rnd2 где-то встречаются "... and then..." где-то нет метки где-то получение кол-ва пореходов на метку без префикса count_ (ошибка не синтаксиса - ищем сами) в других квестах типичная ошибка - неправильно набранная, а то и полное отсутствие команды pln

Nex: движек

noname: abcdef пишет: про system и sys - это просто попытка систематизировать операции подстановки, тем более прогон квеста на ошибки в местах "system" - может выдвать очень интересные сообщения, т.к. логика переходов нарушена при сканировании квеста и там к моменту проверки может находиться что угодно... это что? признание лажовости такого подхода, или наоборот- оправдание? по-любому, использование system и sys (если их станут использовать, а их- не станут) могут стать причиной различных неотлавливаемых скандеббагером ошибок. и просто это не удобно и не в духе URQL Любые добавления в URQL должны быть очень аккуратными, и не зависеть от технических деталей реализации того или иного интерпретатора- здесь я с Victor абсолютно согласен про ошибки с system и sys поясняю: instr sys=масс#x$#y$ if system=1 then btn .... вот как-то не вполне привычно, что присваивать нужно одной переменной, а сравнивать значение- переменной с другим именем. если бы вместо system было #sys$ - выглядело бы логичнее. подобные штуки- чему присваивать, откуда брать значение- могут стать причиной случайных ошибок. часть из них будет просто невозможно отловить скандеббагером в силу их специфики с учётом того, что вышеприведённые две строчки взяты из квеста, где идут подряд строчки вида: if масс#x$#y$=1 then btn Север, Север & btn Юг, Юг & btn Запад, Запад & btn Восток, Восток описывающие эдакий массив (это из Холма Фей, кажется), которые ты предлагаешь переделывать подобным образом, смотри что получим: 27-м строчек подряд нужно переделать каждый раз с использованием sys и system. не очень-то и удобно? опять же, совершенно не ясно: если уж интерпретатор понимает строку sys=масс#x$#y$, то непонимание строки if масс#x$#y$=1 then крайне странно. если это и не ошибка, то, по крайней мере явная нелогичность данного конкретного интерпретатора. поясню: в структурах вида переменная = выражение if выражение=выражение then ... подход к понятию 'выражение' должен быть одинаковым. и плодить варианты 'выражения для всего, кроме...' и 'просто выражение' - не очень-то красиво

abcdef: noname- есть такое понятие: ошибки времени исполнения (например деление на переменную которая равна нулю), скандебагер не все такие ошибки отлавливает, а в частности то что справедливо для system, то будет и для #$ если я это добавлю. Давайте разберемся с #$ как я понял это используется для: 1. модификации адреса перехода 2. эмуляции доступа к переменным массива в остальных случаях использование #$ весьма сомнительно и можно реализовать с помощью if then else ___ Да, в случае с system писать приходится больше чем просто #...$ но выглядет логично в концепции интерпретатора где есть разделение на имена пользователя и просто строки текста

Victor: abcdef пишет: ручного приведения типов операндов и др. вычислений (по прежднему оставил опцию компилятора отлавливать эти несоответствияСовет: версии с любым включенным по умолчанию отладочным кодом называть бетами или альфами. Версия без суффиксов должна предназначаться для игроков, которые вообще могут не знать, что такое URQL. (по поводу use) запускал код --^ работает стабильно..Да, был какой-то временный глюк. Снял это замечание в исходном сообщении. при нажатии на эти элементы их выбор становится неактивным до перехода в другую локацию, при выходе из локации происходит выполнение очереди выбранных use_...В других урках (для краткости здесь и далее буду называть урками URQL-интерпретаторы) обработка происходит не так, "стандартным" способом является как раз немедленное выполнение use, вне зависимости от локаций и переходов. Думал чтоб "ввести режим игнорирования ошибок" - но ошибка это неправильная логика, лучше сразу просканировать и разобраться в чем дело, чем неправильно обработанная информация...Прежде всего тут смысл в совместимости. Если завтра придет новый разработчик, который, например, расширит синтаксис оператора btn, то квесты, разработанные специально для его урки будут хоть как-то работать в твоей. Кроме того, автор сможет, например, делать 2 варианта кода, один с использованием каких-то технических новинок, второй "классический". Переход на технически новый вариант может быть специально сделан некорректным с точки зрения старых урок, и такие приемы уже реально иногда используются. если текст обрезает, то это из-за того что в pln слишком длинная строка, исправить можно так: p ...это строка меньше или равно 255 символов...&pln ...это остаток строки...Дописывать пустые коммоны еще ладно, но править так практически каждый квест чтобы запустить - это уже слишком. Тем более, когда в pln есть #$ и трудно заранее посчитать, какая там длина. "сразу переходить куда-нибудь в *32, пока кода еще не так много, и реально будет все вручную проверить при портировании" - проверять в ручную не прийдется, т.к. за интерфейс с пользователемЗабыл уже, как в Паскале с переходом 16-32, но обычно кроме интерфейса надо проверять используемые типы и работу с памятью. Давайте разберемся с #$ как я понял это используется для:А зачем как-то ограничивать #$? Полностью уйти от кода, генерируемого в процессе выполнения, наверное, не удастся, так какая тогда разница, где заменять.

qwerty: noname пишет:опять же, совершенно не ясно: если уж интерпретатор понимает строку sys=масс#x$#y$, то непонимание строки if масс#x$#y$=1 then крайне странно. если это и не ошибка, то, по крайней мере явная нелогичность данного конкретного интерпретатора. поясню: в структурах вида переменная = выражение if выражение=выражение then ... подход к понятию 'выражение' должен быть одинаковым. и плодить варианты 'выражения для всего, кроме...' и 'просто выражение' - не очень-то красиво abcdef пишет: Да, в случае с system писать приходится больше чем просто #...$ но выглядет логично в концепции интерпретатора где есть разделение на имена пользователя и просто строки текста наверное ты что-то другое хотел сказать. не может быть, что твой if..then.. не допускает использовать в условных выражениях имён пользователя upd лично мне #$ пока был нужен для огранизации работы с данными. где-то в уроках URQ давал в ответ на один вопрос алгоритм, в котором были использованы переходы по #$. другие варианты использования #$ пока плохо представляю. но это никак не умаляет достоинств этой конструкции

abcdef: http://forum.ifiction.ru/viewtopic.php?pid=15150#p15150 добавлена поддержка шифрованных квестов формата QS1 обнаружена ошибка проверки (при выполнении все нормально) - не обрабатываются выражения со стоящим вначале знаком минус или плюс "-" "+", например: a=-2 необходимо написать a=0-2 ___ проверен разбор нескольких квестов с http://ripsoft.narod.ru/Download.htm Гарри Гаррисон Похождения отважного хомяка Семена: Побег Похождения отважного хомяка Семена-2: КРУТОЙ СПУСК Древний кинжал 1 НАДЕЖДА НА ЖИЗНЬ Без права на надежду Замечания по поводу сканированных квестов: 1. В квесте Гарри Гаррисон автор перевода на URQ намеренно испортил код квеста повсюду на метках отсутствуют либо ":" вначале метки, либо цифра три исправлена на русскую букву "з". 2. Без права на надежду - много ошибок, такое впечатление будто автор также хотел запутать игрока, порой создается впечатление "как это может вообще работать..." ___ Для пользователей: включены все проверки. версия - отладочная.

noname: о, там есть расшифровщик! вау! я теперь смогу доделать квест про Мамеза. НО не захочу а ещё, ещё раз попробую пройти БПНН. помница, играл в неё несколько раз, как только она вышла- далеко от здания не ушёл, и осталось впечатление, что я прошёл далеко не до конца этой неоконченной игры. а слишком много параметров в ней зря сделали. лучше сделать мало, но понятно расписанных- на что влияют, и активно используемых так шо прохожу БПНН // да, и намеренно авторы ничего не портят. и даже finereader при распознавании заменяет тройки буквами 'з' безо всякого злого умысла. SkyNet ведь пока ещё не придумали

Victor: abcdef пишет: 1. В квесте Гарри Гаррисон автор перевода на URQ намеренно испортил код квеста повсюду на метках отсутствуют либо ":" вначале метки, либо цифра три исправлена на русскую букву "з".Вряд ли это было намеренно, но метки там, да, неправильные, я потому и писал, что не стоит тестировать на этом квесте. 2. Без права на надежду - много ошибок, такое впечатление будто автор также хотел запутать игрока, порой создается впечатление "как это может вообще работать..."Там счетчики заходов на локацию везде без приставки "count_". В остальном все то, что включено в демо-версию, должно работать. Мелкие баги из-за ошибок в коде иногда есть, но они существенно не влияют на геймплей.

qwerty: не нравится мне название темы... гости могут подумать, что abcdef написал новую версию urql-интерпретатора, а это дважды не так: 1. он ещё не дописан 2. он не поддерживает язык URQL. я так понимаю, что этого даже в планах нет и про стандарт 'парсера': что бы там ни имел ввиду abcdef под парсером, но стандарт, принятый лишь одним участником форума(и при этом- новичком)- это ещё не стандарт. насколько я понимаю текущую ситуацию(и мнение по этому поводу форумчан)- в общем и целом уже сложившийся стандарт в столь кардинальном пересмотре не нуждается и, раз уж начал: название aurq слишком похоже на название популярного интерпретатора akurq abcdef, зачем так людей путать?

abcdef: 1. Я написал новую версию URQ - интерпретатора. 2. Из недоработок - пока не поддерживаются операции сравнения строк. 3. Различие со стандартом URQ - подмена имен переменных и меток через переменную sys: instr sys=имя a=system*2+9 goto system 4. Парсер я не изобретал, его конструкции и стандарты придумывали разработчики языков программирования высокого уровня, а я просто переложил URQL. 5. Удивляет одно - квесты пролежавшие столько лет на всеобщем обозрении, так и не были исправлены от ошибок. 6. Если что-то не нравится-что ж, это ваше право. Но давайте больше делать, чем говорить. А посетители этой темы сами разберуться что им надо, а что-нет.

Nex: Больше делать, чем говорить? Неслыханно.

ASBer: Nex пишет: Неслыханно.

Chicago1920: Автору - советую не обращать внимания, на разговоры о том, что аурка не нужна. Сделать ее, отшлифовать, довести до блеска, протестировать и возмжно она всем понравится. Удачи в этом не легком деле!!!

Victor: abcdef пишет: 4. Парсер я не изобретал, его конструкции и стандарты придумывали разработчики языков программирования высокого уровня, а я просто переложил URQL.URQL позволяет реализовать в квесте минимальный парсер вводимых игроком команд. Было уже несколько попыток составить план расширения парсерных возможностей языка, и именно это называли написанием стандарта парсера. По одному лишь названию треда мне, например, не было ясно, какой парсер имеется в виду. 5. Удивляет одно - квесты пролежавшие столько лет на всеобщем обозрении, так и не были исправлены от ошибок.Стальная крыса Гаррисона была очень тщательно адаптирована заново после того, как первый вариант был выложен у Рипа. Что касается менее очевидных случаев, я когда-то давно занимался составлением списка найденных ошибок в коде выложенных квестов, делал исправленные версии, и мы их одно время включали в различные архивы вместе с оригиналами. Потом возник вопрос о том, что не все авторы хотят, чтобы кто-либо правил код их игры, тем более, что иногда исправление даже мелкой технической ошибки все-таки влияет на сюжет. В итоге лично я стал только лишь сообщать авторам о найденных проблемах и способах исправления, а уж вносить правки в игру или нет, выкладывать новую версию или оставить все как есть - это уж пусть они сами решают.

abcdef: Victor - я полностью согласен, что авторы против редактирования их квестов, и ошибки возможно ведут именно тому сюжету, который хотел автор, но в таком случае логика будет меняться и от используемого интерпретатора: например в том же квесте "буратино" при запуске к примеру в FireURQ активизируется инвентарь, который должен появиться только к середине квеста. Это выражается в условиях на доступные фразы к персонажам, например продавцу в магазине.. и тд

noname: буратино не был предназначен для fireurq, которого тогда не было, НО думаю, что автору fireurq - Firetonу будет интересна эта информация. и, возможно, он доработает свою платформу



полная версия страницы