С для профессиональных программистов



         

Синтаксический анализатор выражений - часть 2


level3(&hold);

arith(op,result,&hold);

/* Вычисление произведения или частного двух фвкторов */

void level3(result)

int *result;

register char op;

int hold;

level4(result);

while((op = *token) == '+' || op == '/' || op == '%')

get_token();

level4(&hold);

arith(op,result,&hold);

/* Обработка степени числа (целочисленной) */

void level4(result)

int *result;

int hold;

level5(result);

if(*token== '^')

get_token();

level4(&hold);

arith('^', result, &hold);

/* Унарный + или - */

void level5(result)

int *result;

register char op;

op = 0;

if((token_type==DELIMITER) && *token=='+' || *token=='-')

op = *token;

get_token();

level6(result);

if(op)

unary(op, result);

/* Обработка выражения в круглых скобках */

void level6(result)

int *result;

if((*token == '(') && (token_type == DELIMITER))

get_token();

level2(result);

if(*token != ')')

serror(1);

get_token();

else

primitive(result);

/* Определение значения переменной по ее имени */

void primitive(result)

int *result;

switch(token_type)

case VARIABLE:

*result = find_var(token);

get_token();

return;

case NUMBER:

*result  = atoi(token);

get_token();

return;

default:

serror(0);

/* Выполнение специфицированной арифметики */

void arith(o, r, h)

char o;

int *r, *h;

register int t, ex;

switch(o)

 

case '-':

*r = *r-*h;

break;

case '+':

*r = *r+*h;

break;

case '*':

*r = *r * *h;

break;

case '/':

*r = (*r)/(*h);

break;

case '%':

t = (*r)/(*h);

*r = *r-(t*(*h));

break;

case '^':

ex =*r;

if(*h==0)

*r = 1;

break;

for(t=*h-1; t>0; --t) *r = (*r) * ex;

break;

/* Изменение знака */

void unary(o, r)

char o;

int *r;

if(o=='-') *r = -(*r);

/* Поиск значения переменной */

int find_var(s)

char *s;

if(!isalpha(*s))

serror(4); /* не переменная */




Содержание  Назад  Вперед