Создай язык сам, или конструктор для программиста
Спецвыпуск Хакер, номер #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,},
{">", 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);