Различия

Здесь показаны различия между выбранной ревизией и текущей версией данной страницы.

Ссылка на это сравнение

aq:netherscript [03.09.2009 11:46]
VorteX
aq:netherscript [25.12.2012 23:56] (текущий)
Строка 1: Строка 1:
 +Это незаконченный документ! 
  
 +NetherScript 2.0 - это настраиваемый парсер, написанный на QuakeC. Файлы, написанные на скрипте NetherScript 2.0 обычно имеют расширение NS2. Язык NetherScript состоит из общих инструкций (инструкции прекомпилятора) и предметных инструкций. 
 +
 +Общие инструкции являются частью ядра NetherScript и работают одинаково для всех, они управляют ходом обработки документа. С помощью общих инструкций можно выносить в шаблоны часто используемый код, разбить файл скрипта на несколько файлов, изменить ход выполнения обработки и произвести другие трюки. Вcе общие инструкции начинаются с символа "#" 
 +
 +Предметные инструкции определяются в коде QuakeC в зависимости от области, для которой настраивается парсер. Таким образом одно ядро NetherScript может обслуживать неограниченное число предметных областей самых разный типов. Например в Arcade Quake на нем описывается интерфейс меню, хад, монстры, предметы, оружие. В данной статье такие инструкции описаны не будут. 
 +
 +====== Синтаксис ====== 
 + 
 +Весь исходный текст подразделяется на сущности двух видов - слова и строки. Строки разделяются между собой символом возврата каретки, а слова при разделении подчиняются следующим правилам: 
 +  * пробел и табуляция - отделяют одно слово от другого 
 +  * спецсимволы \ ( ) [ ] { } ; : , . являются сами по себе словами, их не нужно отделять пробелом или табуляцией 
 +  * "текст заключенный в двойные кавычки" - всегда считается одним словом 
 +  * 'текст заключенный в одинарные кавычки' - тоже считается одним словом 
 +  * // комментарий до конца строки //
 +  * /* комментарий в середине строки */
 +
 +
 +Внимание! Многострочный комментарий вида /* */ не поддерживается! Используйте вместо него условие #if 0 ... #endif (см п.6) 
 +
 +
 +====== Подключение файлов ====== 
 +<code java>
 +#include имя_файла 
 +</code>
 +Подключает содержание файла к процессу парсинга. В имени файла можно указывать добавочные пути (например monsters/soldier.ns2), но нельзя указывать относительные пути. (например ../monsters.ns2). 
 +
 +Другие правила: 
 +
 +префикс './' к имени файла заставит парсер искать файл в той же папке, что и текущий файл 
 +параметр вида <имя файла> - означает что инклюдится системный файл, и искать его парсер будет в каталоге script/system/ 
 +в любом другом случае проверять файл парсер будет в папке scripts/ 
 +
 +Пример использования #include: 
 +<code java>
 +#include "./my_defs.ns2"
 +#include "my_defs.ns2"
 +#include "monsters/mynewmonster.ns2"
 +#include "<my_defs.ns2>"
 +</code>
 +
 +Ограничения: 
 +
 +Макс. 64 подключения файлов (включая начальный) 
 +
 +====== Константы #define ======
 +
 +Константы используются для вставки в код готовых шаблонов. Чтобы вставить константу в произвольное место кода, нужно использовать синтаксис [имя_константы]. Самый простой пример использования констант: 
 +
 +<code java>
 +#define true 1
 +#define false 2
 +// Вместо [true] и [false] обработчик кода увидит 1 и 0
 +MonsterClass MySoldier
 +{
 +  health 40
 +  cantaketamage [true]
 +  deathobituary [false]
 +}
 +</code>
 +
 +Константы типа #define при вставке сохраняют свою структуру слов: 
 +
 +<code java>
 +// Вместо [true] и [false] обработчик кода увидит 1 и 0
 +#define defMySoldier MonsterClass MySoldier
 +[defMySoldier]
 +{
 +  health 40
 +  cantaketamage 1
 +  deathobituary 0
 +  deathstring "You have killed my soldier!"
 +}
 +</code>
 +
 +Но если определить константу с помощью инструкции #defword, то она при вставке будет представлять из себя одно слово 
 +
 +<code java>
 +// Вместо [true] и [false] обработчик кода увидит 1 и 0
 +#defword mySoldierDeathMessage You have killed my soldier!
 +// еще можно описать константу так:
 +// #define mySoldierDeathMessage "You have killed my soldier!"
 +MonsterClass MySoldier
 +{
 +  health 40
 +  cantaketamage 0
 +  deathobituary 1
 +  deathstring [mySoldierDeathMessage]
 +}
 +</code>  
 ++
 +<code java> 
 +  #define имя_константы (параметр1, параметр2...параметр16) текст_константы
 +  #define имя_константы текст_константы
 +  #const имя_константы(параметр1,параметр2...) текст_константы
 +  #const имя_константы текст_константы
 +  #undef имя_константы_или_макрокоманды
 +  #redef
 +  #redefword
 +  #undefall
 +</code>
 +
 +Ограничения: 
 +* макс. параметров: 16 
 +* макс. длина имени параметра: 32 символа 
 +
 +====== Макрофункция #macro ======
 +
 + То же самое, что и #define, но для использования в коде нужно использовать синтаксис @имя_макро_команды(параметры). Сделана для удобочитаемости кода. Имя макрофункции может совпадать с именем константы, объявленной через #define/#defword 
 +
 +<code java>
 +#macro имя_константы(параметр1,параметр2...) содержание
 +#macro имя_константы содержание
 +#macroword имя_константы(параметр1,параметр2...) содержание
 +#macroword имя_константы содержание
 +</code>
 +
 +====== Енумерация #enum ====== 
 +<code java>
 +#enum int { ... }
 +#enum flags { ... }
 +</code>
 +
 +====== Условия и переходы ======
 +<code>
 +#if значение ... #elseif значение ... #else ... #endif
 +#ifdef значение ...
 +#goto метка
 +#label имя_метки
 +#skip количество words
 +#skip колколичество lines
 +#eof
 +</code>
 +
 +====== Управление парсером ====== 
 +<code>
 +#pragma параметр значение
 +#pragma precompiler on/off
 +#pragma warnings 0/1/2/3
 +#pragma debug 0/1
 +#pragma debugmessages 0/1
 +#pragma labels_on_failed_ifs 0/1
 +</code>
 +
 +====== Служебные инструкции ====== 
 +<code java>
 +#message сообщение
 +#error сообщение
 +#warning сообщение
 +#debug сообщение
 +#printdef имя_константы
 +#printmacro имя_макрокоманды
 +</code>
 +
 +====== Системные константы и макрофункции ======
 +<code java>
 +@true
 +@on
 +@false
 +@off
 +@random
 +@random(x,y)
 +@crandom 
 +@chance(x)
 +@defined(n)
 +@equal(x,y)
 +@bitand(x,y)
 +@bitor(x,y)
 +@label_list
 +@define_list
 +</code>
 
За исключением случаев, когда указано иное, содержимое этой вики предоставляется на условиях следующей лицензии: CC Attribution-Noncommercial-Share Alike 3.0 Unported
Recent changes RSS feed Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki