private Expression primary() {
		Expression e = null;
		
		// variable or function call
		if (currentToken.type() == Token.Type.Identifier) {
			Variable v = new Variable(currentToken.value());
			match(Token.Type.Identifier);
			
			// function call
			if(currentToken.type() == Token.Type.LeftParen)
				e = callStatement(v);
			// variable
			else
				e = v;
			
		// literal
		} else if (isLiteral()) {
			e = literal();
			
		// expression
		} else if (currentToken.type().equals(Token.Type.LeftParen)) {
			currentToken = lexer.next();
			e = expression();
			match(Token.Type.RightParen);
			
		// type cast
		} else if (isType()) {
			Operator op = new Operator(currentToken.value());
			match(currentToken.type());
			match(Token.Type.LeftParen);
			Expression term = expression();
			match(Token.Type.RightParen);
			e = new Unary(op, term);
		} else
			error("Identifier | Literal | ( | Type");
		return e;
	}