Создай язык сам, или конструктор для программиста

Спецвыпуск Хакер, номер #004, стр. 004-066-2

PLC_KEYWORD KeywordList[]=

{

{ "IF","","",

PLC_KEY_OPEN,PLC_KEY_EXPRESSION,PLC_KEY_CLOSE,

PLC_KEY_STATEMENT,

PLC_KEY_DONE,

},

{ "ELSE","","",

PLC_KEY_STATEMENT,

PLC_KEY_DONE,

},

{ "FOR","","",

PLC_KEY_OPEN,PLC_KEY_EXPRESSION,PLC_KEY_DIVIDER,

PLC_KEY_EXPRESSION,PLC_KEY_DIVIDER,

PLC_KEY_EXPRESSION,PLC_KEY_CLOSE,

PLC_KEY_STATEMENT,

PLC_KEY_DONE,

},

{ "GOTO","","",

PLC_KEY_SYMBOL,

PLC_KEY_DONE,

}

};

В структуре PLC_OPERATOR определены операции, которые можно проводить над различными элементами - переменными, числами и строками. Для своего бейсика я оставил только простые арифметические операции и операции сравнения "больше/меньше":

PLC_OPERATOR OperatorList[]=

{

{"+", 0, TRUE, PLC_OP_NEXTIFNOPREV,},

{"-", 0, TRUE, PLC_OP_NEXTIFNOPREV,},

{"*", 1, FALSE, PLC_OP_BOTH,},

{"/", 1, FALSE, PLC_OP_BOTH,},

{"+", 2, FALSE, PLC_OP_BOTH,},

{"-", 2, FALSE, PLC_OP_BOTH,},

{"", 3, FALSE, PLC_OP_BOTH,},

{">=", 3, FALSE, PLC_OP_BOTH,},

{"=", 4, FALSE, PLC_OP_BOTH,},

{"", 4, FALSE, PLC_OP_BOTH,},

{"=", 4, TRUE, PLC_OP_BOTH,},

{",", 4, FALSE, PLC_OP_BOTH,},

};

Теперь осталось самое интересное - необходимо исправить процедуры ApplyOperator() и ExecKeyword(), которые, собственно, и определяют то, как будет выполняться программа. Процедура ExecKeyword() отвечает за исполнение зарезервированных слов (IF, GOTO и т.д.), а ApplyOperator() должна проводить вычисления и определять результат всяческих операций.

void ExecKeyword(PLC_TOKEN *Token,bool *IfResultPtr)

{

PLC_TOKEN *Statement,*Expression1,*Expression2,*Expression3,*TokenTemp;

switch(Token->SubType)

{

// IF

case TT_KEY_IF:

Expression1=PLC_TOKENNEXT(PLC_TOK_Anchor(Token));

Statement=PLC_TOKENNEXT(&Expression1->Link);

PLC_ExecExpression(PLC_TOK_Anchor(Expression1));

*IfResultPtr=PLC_DT_GetBool(&PLC_Result);

if(*IfResultPtr) PLC_ExecStatement(PLC_TOKENNEXT(&Expression1->Link),NULL);

break;

// ELSE

case TT_KEY_ELSE:

Statement=PLC_TOKENNEXT(PLC_TOK_Anchor(Token));

if(!*IfResultPtr) PLC_ExecStatement(Statement,NULL);

break;

// FOR

case TT_KEY_FOR:

Expression1=PLC_TOKENNEXT(PLC_TOK_Anchor(Token));

Expression2=PLC_TOKENNEXT(&Expression1->Link);

Expression3=PLC_TOKENNEXT(&Expression2->Link);

Statement=PLC_TOKENNEXT(&Expression3->Link);

Назад на стр. 004-066-1  Содержание  Вперед на стр. 004-066-3

загрузка...
Cпец Хакер #075Cпец Хакер #074Cпец Хакер #073Cпец Хакер #072Cпец Хакер #071Cпец Хакер #070Cпец Хакер #069Cпец Хакер #068Cпец Хакер #067Cпец Хакер #066Cпец Хакер #065Cпец Хакер #064Cпец Хакер #063Cпец Хакер #062Cпец Хакер #061Cпец Хакер #060Cпец Хакер #059Cпец Хакер #058Cпец Хакер #057Cпец Хакер #056Cпец Хакер #055Cпец Хакер #054Cпец Хакер #053Cпец Хакер #052Cпец Хакер #051Cпец Хакер #050Cпец Хакер #049Cпец Хакер #048Cпец Хакер #047Cпец Хакер #046Cпец Хакер #045Cпец Хакер #044Cпец Хакер #043Cпец Хакер #042Cпец Хакер #041Cпец Хакер #040Cпец Хакер #039Cпец Хакер #038Cпец Хакер #037Cпец Хакер #036Cпец Хакер #035Cпец Хакер #034Cпец Хакер #033Cпец Хакер #032Cпец Хакер #031Cпец Хакер #030Cпец Хакер #029Cпец Хакер #028Cпец Хакер #027Cпец Хакер #026Cпец Хакер #025Cпец Хакер #024Cпец Хакер #023Cпец Хакер #022Cпец Хакер #021Cпец Хакер #020Cпец Хакер #019Cпец Хакер #018Cпец Хакер #017Cпец Хакер #016Cпец Хакер #015Cпец Хакер #014Cпец Хакер #013Cпец Хакер #012Cпец Хакер #011Cпец Хакер #010Cпец Хакер #009Cпец Хакер #008Cпец Хакер #007Cпец Хакер #006Cпец Хакер #005Cпец Хакер #004Cпец Хакер #003Cпец Хакер #002Cпец Хакер #001