コード例 #1
0
/* Обработка выражения в присваивании */
void eval_exp0(int *value) {
	char temp[ID_LEN];  /* содержит имя переменной,
                         которой присваивается значение */
	register int temp_tok;
	if(token_type == IDENTIFIER) {
		if(is_var(token)) {
			/* если эта переменная,
			                      посмотреть, присваивается ли ей значение */
			if(is_arr(token)) {
				sntx_err(SYNTAX); // todo: make message: redefinition of array is illegal
			}
			strcpy(temp, token);
			temp_tok = token_type;
			get_token();
			if(*token == '=') {  /* это присваивание */
				get_token();
				eval_exp0(value);  /* вычислить присваемое значение */
				assign_var(temp, *value);  /* присвоить значение */
				return;
			} else { /* не присваивание */
				putback();  /* востановление лексемы */
				strcpy(token, temp);
				token_type = temp_tok;
			}
		} else if(is_arr(token)) {
			strcpy(temp, token);
			temp_tok = token_type;
			get_token();
			if(*token == '[') {
				get_token();
				eval_exp0(value); // вычисление выражения в [] скобках
				int arr_index = *value;
				get_token(); // '=' or ';'
				if(*token == '=') {  /* это присваивание */
					get_token();
					eval_exp0(value);  /* вычислить присваемое значение */
					assign_arr_element(temp, arr_index, *value);  /* присвоить значение */
					return;
				} else { /* не присваивание */
					putback();  /* востановление лексемы */
					strcpy(token, temp);
					token_type = temp_tok;
				}
			} else {
				sntx_err(ASSIGN_ARRAY_ILLEGAL);
			}
		}
	}
	eval_exp1(value);
}
コード例 #2
0
ファイル: parser.c プロジェクト: rrizun/littlec
/* Process an assignment expression */
void eval_exp0(int *value)
{
  char temp[ID_LEN];  /* holds name of var receiving
                         the assignment */
  register int temp_tok;
  if(token_type==IDENTIFIER) {
    if(is_var(token)) {  /* if a var, see if assignment */
      strcpy(temp, token);
      temp_tok = token_type;
      get_token();
      if(*token=='=') {  /* is an assignment */
   get_token();
   eval_exp0(value);  /* get value to assign */
   assign_var(temp, *value);  /* assign the value */
       return;
      }
      else {  /* not an assignment */
   putback();  /* restore original token */
   strcpy(token, temp);
   token_type = temp_tok;
      }
    }
  }
  eval_exp1(value);
}
コード例 #3
0
ファイル: parser.cpp プロジェクト: jsjtxietian/Cpp
void eval_exp0(int &value)
{
	char temp[MAX_ID_LEN + 1];

	tok_types temp_tok;

	if (token_type == IDENTIFIER) 
	{
		if (is_var(token)) 
		{
			strcpy(temp, token);
			temp_tok = token_type;
			get_token();
			if (*token == '=') 
			{ 
				get_token();
				eval_exp0(value); 
				assign_var(temp, value); 
				return;
			}
			else 
			{ 
				putback(); 
				strcpy(token, temp);
				token_type = temp_tok;
			}
		}
	}
	eval_exp1(value);
}
コード例 #4
0
ファイル: parser.c プロジェクト: rrizun/littlec
/* Process parenthesized expression. */
void eval_exp5(int *value)
{
  if((*token == '(')) {
    get_token();
    eval_exp0(value);   /* get subexpression */
    if(*token != ')') sntx_err(PAREN_EXPECTED);
    get_token();
  }
  else
    atom(value);
}
コード例 #5
0
/* Обработка выражения в скобках. */
void eval_exp5(int *value) {
	if(*token == '(') {
		get_token();
		eval_exp0(value);   /* вычисление подвыражения */
		if(*token != ')') {
			sntx_err(PAREN_EXPECTED);
		}
		get_token();
	} else {
		atom(value);
	}
}
コード例 #6
0
/* Точка входа для вычисления выражение в синтаксическом дереве */
void eval_exp(int *value) {
	get_token();
	if(!*token) {
		sntx_err(NO_EXP);
		return;
	}
	if(*token == ';') {
		*value = 0; /* пустое выражение */
		return;
	}
	eval_exp0(value);
	putback(); /* возврат последней лексемы во входной поток */
}
コード例 #7
0
ファイル: parser.c プロジェクト: rrizun/littlec
/* Entry point into parser. */
void eval_exp(int *value)
{
  get_token();
  if(!*token) {
    sntx_err(NO_EXP);
    return;
  }
  if(*token==';') {
    *value = 0; /* empty expression */
    return;
  }
  eval_exp0(value);
  putback(); /* return last token read to input stream */
}
コード例 #8
0
ファイル: c.c プロジェクト: bsmr-misc-forks/kroc
void eval_exp(int *value)
{
    get_token();
    if(!*token) {
        sntx_err(NO_EXP);
        return;
    }
    if(*token==';') {
        *value = 0; 
        return;
    }
    eval_exp0(value);
    putback();
}
コード例 #9
0
ファイル: parser.cpp プロジェクト: jsjtxietian/Cpp
// Process parenthesized expression. 
void eval_exp5(int &value)
{

	if ((*token == '(')) {
		get_token();

		eval_exp0(value); // get subexpression 

		if (*token != ')')
			throw InterpExc(PAREN_EXPECTED);
		get_token();
	}
	else
		atom(value);
}
コード例 #10
0
ファイル: parser.cpp プロジェクト: jsjtxietian/Cpp
void eval_exp(int &value)
{
	get_token();

	if(!*token)
	{
		throw InterpExc(NO_EXP);
	}

	if (*token == ';')
	{
		value = 0;
		return;
	}

	eval_exp0(value);

	putback();
}