Вверх ↑
Администрация
Ответов: 15294
Рейтинг: 1518
#1: 2008-06-11 17:43:41 ЛС | профиль | цитата
С синтаксисом все просто: недавно добавил последние правки и теперь он полностью описан тут HiAsm\Пакеты\Структура пакета HiAsm\FTCG\Описание синтаксиса. С той лишь разницей, что объекты _arr, sys, block и lng должны быть действительно объектами и обладать такими возможностями:

#hws
fvar(s)
s = block
s.select( BLK_BODY )

а то в FTCG они только именуются объектами и таковыми не являются даже близко. Это все нужно для того, чтобы сделать более удобный и красивый интерфейс cgt, который бы возвращал именно объекты(схема, елемент, св-во, точка и т.д.), а не их id.

Оформление:
обязательное наличие процедуры загрузки и выгрузки

#cpp
int initScript(char *fileName, int data); // <- возвращает некий id объекта скрипта, fileName - текст скрипта, data - некие данные
void freeScript(int id);

точка выполнения методов скрипта

#cpp
TValue *run(int id, char *entryPoint, TValues *args);
// после отработки функции скрипта значение возвращается в типе TValue
// id - то, что вернулось после initScript
// entryPoint - тут все ясно
// args массив аргументов

регистрация внешних методов

#cpp
int regFunc(int id, TFunc *func);
// возвращает код ошибки
// func указатель на функцию

регистрация внешних переменных

#cpp
int regVariable(int id, TArg *var);
// var - определяет тип и область памяти внешней переменной

регистрация внешних объектов
(тут надо еще подумать каким интерфейсом это лучше организовать. Как раз объекты lng, block и sys должны быть реализованы через него и не являтся частью синтаксиса скрипта)
примерный вариант такой:

#cpp
int regObject(int id, TFuncList *methods, TArgs *fields, char *name);

где:

#cpp
typedef struct {
char *name;
int type;
void *value;
} TArg;

typedef struct {
int count;
TArg arg[];
} TArgs;

typedef struct {
int type;
void *value;
} TValue;

typedef struct {
int count;
TValue arg[];
} TValues;

typedef TValue*(TFuncProc) (int data, TValues *args);

typedef struct {
char *name;
TFuncProc *proc;
TArgs *args;
} TFunc;

typedef struct {
int count;
TFunc *procs[];
} TFuncList;

typedef struct {
int count;
TFunc *procs[];
} TFieldList;

------------ Дoбавленo:

в будущем наверно имело бы смысл приделать и пользовательские типы, чтобы скажем делать такое:

#hws
func test()
fvar(s)
s = new TStringList()
s.add("hello world")
s.add("second string")
trace(s.text)
end

с описанным выше интерфейсом это можно сделать и так, если все объекты хранить на стороне "клиента" и регить их в скрипте через regObject:

#hws
func test()
fvar(s)
s = makeObject('TStringList')
s.add("hello world")
s.add("second string")
trace(s.text)
end

карма: 26
0