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

Спецвыпуск Хакер, номер #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

ttfb: 2.3040771484375 ms