Пример #1
0
  addressType
evaluateMvariable(void)
{
	symbolType	*symbol;

	symbol = getSymbol();
	pushSymbol(symbol, evaluateExpression);
}
Пример #2
0
  void
bindFunctionArguments(functionType *theFunction, int argCount)
{
	argumentListType	*argList;

	argList = theFunction->functionArguments;
	while (argCount > 0) {
		if (argList == NULL) {
			error(TOO_MANY_FUNCTION_ARGUMENTS_ERROR);
			while (argCount-- > 0)
				skipExpression();
		} else {
			pushSymbol(argList->argumentSymbol,
					evaluateExpression());
			argList = argList->nextArgument;
			argCount--;
		}
	}
	while (argList != NULL) {
		pushSymbol(argList->argumentSymbol, 0);
		argList = argList->nextArgument;
	}
}
Пример #3
0
ParseStatus Parser::evalExpression() {
  ParseStatus error = PARSE_OK;
  while (error == PARSE_OK) {
    Token t = lex[0];

    // Check for terminators if we're not in a nested expression.
    if (t.isDelimiter()) {
      if (t.isTerminator() && delimiterDepth == 0) {
        break;
      }
      error = pushDelimiter(t);
    }

    if (t.isLiteral()) {
      error = pushSymbol(t);
    }
    
    if (t.isOperator()) {
      error = pushOperator(t);
    }
    

    if (!error) lex++;
    continue;
  }
  if (error) return error;

  return emitEval();

  /*
  Token base = lex[0];
  Token op = lex[1];

  if (op.isDelimiter(DL_SEMICOLON)) {
    // either "literal;" or "identifier;"
    return evalLiteral();
  }

  if (base.isKeyword(KW_FUNCTION)) {
    return parseFunction();
  }

  if (base.isDelimiter(DL_LPAREN)) {
    // Tuple
    return parseTuple();
  }

  if (base.isDelimiter(DL_LBRACE)) {
    return parseBlock();
  }

  switch(base.type) {
    case TT_EOF:
    case TT_INVALID:
      // Something's broken.
      assert(false);
      break;

    case TT_OPERATOR:
      // Unary operator
      assert(false);
      break;
    case TT_DELIMITER:
      // Tuple, array literal, block literal.
      assert(false);
      break;

    case TT_NATIVE:
      // Static cast to native type.
      assert(false);
      break;

    case TT_IDENTIFIER:
      // Function call or copy from variable.
      assert(false);

    case TT_INTEGER:
      // Expression starting with integer.
      assert(false);

    case TT_FLOAT:
      assert(false);
    case TT_RUNE:
      assert(false);
    case TT_STRING:
      assert(false);
    case TT_DIRECTIVE:
      assert(false);
    case TT_COMMENT:
      assert(false);
  }

  assert(false);
  return PARSE_ERROR;
  */
}